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);
}