使用BinaryFormatter将自动实现的属性更改为正常和反序列化

时间:2012-12-05 14:06:26

标签: c# .net serialization automatic-properties

我有一个实现像

的属性的对象
public String Bla {get;set;} 

将实现更改为

之后
private String _bla;

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

在反序列化时,此属性显示为空。

我有来自旧实现的大量序列化数据,并希望使用新实现加载它们

有什么办法可以将实现更改为与旧的二进制文件兼容吗?

修改

有些人可能遇到同样的问题,所以这是我的hackish解决方案:

自动生成的字段的命名约定是无效的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的私有支持字段,

并在反序列化之前将<MyField>的所有出现替换为xMyFieldx来修补序列化的二进制数据

2 个答案:

答案 0 :(得分:2)

尝试实施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);
    }

答案 1 :(得分:1)

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

您可以通过查看ILSpy中的自动生成的字段名称或类似内容并以此方式命名您的方式来使其工作。

否则如Henrik所述,您必须编写自己的反序列化,有关详细信息,请参阅this question

您可以通过实施ISerializable和特殊情况此字段来检查反序列化信息。