使用BinaryFormatter将自动实现的属性更改为正常和反序列化
我有一个实现像属性的对象
public String Bla {get;set;}
在将实现更改为类似之后
private String _bla; public String Bla { get { return _bla; } set { _bla = value; } }
在反序列化中,这个属性是空的。
我有来自旧实现的大量序列化数据,并希望使用新实现加载它们
有没有办法,改变实现与旧的二进制文件兼容?
编辑:
有些人可能遇到同样的问题,所以这是我的hackish解决方案:
自动生成的字段的命名约定是无效的c#代码:
[CompilerGenerated] private string k__BackingField; [CompilerGenerated] public void set_MyField(string value) { this.k__BackingField = value; } [CompilerGenerated] public string get_MyField() { return this.k__BackingField; }
对我来说快速而肮脏的修复是在源代码中创建一个名为xMyFieldxK__BackingField
的私有支持字段,
通过在反序列xMyFieldx
之前用xMyFieldx
替换所有出现的来修补序列化的二进制数据
尝试实现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
和特殊情况来检查反序列化信息。