5

我有一个对象,其属性实现如下

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

4

2 回答 2

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);
    }
于 2012-12-05T14:53:16.347 回答
1

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

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

否则,如 Henrik 所述,您将不得不编写自己的反序列化,请参阅此问题以获取更多信息

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

于 2012-12-05T16:10:54.593 回答