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

C# 使用BinaryFormatter将自动实现的属性更改为正常和反序列化,c#,.net,serialization,automatic-properties,C#,.net,Serialization,Automatic Properties,我有一个对象,其属性实现如下 public String Bla {get;set;} 将实现更改为 private String _bla; public String Bla { get { return _bla; } set { _bla = value; } } 反序列化时,此属性显示为空 我有很多来自旧实现的序列化数据,我想用新实现加载它们 有没有办法将实现更改为与旧的二进制文件兼容 编辑: 有些人可能会遇到同样的问题,因此我的黑客解决方案如下: 自动生成

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

public String Bla {get;set;} 
将实现更改为

private String _bla;

public String Bla
{
    get { return _bla; }
    set { _bla = value; } 
} 
反序列化时,此属性显示为空

我有很多来自旧实现的序列化数据,我想用新实现加载它们

有没有办法将实现更改为与旧的二进制文件兼容

编辑:

有些人可能会遇到同样的问题,因此我的黑客解决方案如下:

自动生成的字段具有无效的c#代码命名约定:

[编译生成]
私有字符串k__BackingField;
[编译生成]
公共无效集\u MyField(字符串值)
{
this.k_uubackingfield=值;
}
[编译生成]
公共字符串get_MyField()
{
返回此.k__BackingField;
}
对我来说,快速而肮脏的修复方法是在源代码中创建一个名为
xMyFieldxK\uuu BackingField
的私有支持字段


在反序列化之前,通过将所有出现的
替换为
xmyfiedx
来修补序列化的二进制数据

尝试实现
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
和此字段的特殊情况来检查反序列化信息。

您所说的“与旧的二进制文件兼容”是什么意思?@GregorPrimar:我有很多旧实现的序列化数据,我想用新的实现来加载它们。我非常怀疑用二进制反序列化能做到这一点。您应该使用XmlSerializer,然后还可以反序列化旧版本。实际上,两种实现之间没有区别。如果使用第一个实现,编译器将创建与第二个实现非常相似的代码。因此,您必须有理由更改代码-例如,控制对属性的访问。你能给我们看看你的代码的更多细节吗?(更多信息可以在这里找到:)这是一个解决方案,但如果使用大型代码库,肯定会很糟糕。不过我有个主意;代码库很大,但方法正确。我用我的发现更新了我的问题
    [SecurityCritical]
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");

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