簡體   English   中英

使用BinaryFormatter將自動實現的屬性更改為normal和反序列化

[英]Change auto implemented properties to normal and deserialization with BinaryFormatter

我有一個對象,其屬性實現為

public String Bla {get;set;} 

將實現更改為類似

private String _bla;

public String Bla
{
    get { return _bla; }
    set { _bla = value; } 
} 

反序列化時,此屬性顯示為空。

我有許多來自舊實現的序列化數據,並希望將它們與新實現一起加載

有什么辦法可以更改命令以使其與較舊的二進制文件兼容?

編輯:

有些人可能會遇到相同的問題,所以這是我的駭人聽聞的解決方案:

自動生成的字段具有無效的C#代碼命名約定:

[CompilerGenerated]
private string <MyField>k__BackingField;

[CompilerGenerated]
public void set_MyField(string value)
{
    this.<MyField>k__BackingField = value;
}

[CompilerGenerated]
public string get_MyField()
{
    return this.<MyField>k__BackingField;
}

對我來說,快速而骯臟的解決方法是在源代碼中創建一個名為xMyFieldxK__BackingField的私有后備字段,

並且通過替換出現的所有補丁的序列化binarydata <MyField>xMyFieldx deserialisation前

嘗試實現ISerializable

    [SecurityCritical]
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");

        info.AddValue("name of compiler generated field", _bla);
    }

BinaryFormatter序列化字段,而不是屬性。

通過查看自動生成的字段名稱在ILSpy或類似名稱中的名稱,您可能會使其工作。

否則,如Henrik所述,您將必須編寫自己的反序列化,有關更多信息,請參見此問題

您可能可以通過實現ISerializable和特殊情況此字段來檢查反序列化信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM