[英]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.