kar*_*hul 15 .net c# serialization
我试图用旧版本的应用程序反序列化"SomeClass".我得到以下异常
System.Runtime.Serialization.SerializationException:ObjectManager发现无效的修正次数.这通常表示Formatter中存在问题.
当序列化版本0.9并尝试使用版本0.8反序列化时,反序列化会抛出异常.我认为该OptionalField属性可以解决问题,但事实并非如此.
// Version 0.8
[Serializable()]
class Foo{
Bar b;
}
// Version 0.9
[Serializable()]
class Foo{
Bar b;
[OptionalField]
Zoo z;
}
Run Code Online (Sandbox Code Playgroud)
鉴于我无法更改版本0.8,我应该如何向Foo对象添加更多状态,以便以前的版本可以反序列化它们的任何内容?
任何指针都会非常感激.
Update 1 Bar和Zoo是其他可序列化的类,包含Hashtables和其他可序列化的东西.在这些课程中,一切都是可序列化的.另外,我没有任何支柱.
kpr*_*bst 27
首先,永远不要将CLR的序列化功能用于任何类似于长期存储的功能.我们通常会犯这样的错误,将对象放在blob数据库字段中并在后面拍拍我们自己很聪明.然后CLR得到一个补丁或我们的程序集更改版本,你搞砸了.所以不要这样做.
如果您仍想要这样做,管理问题的最佳方法是创建自己的内容SerializationBinder,如下所示:
public sealed class CustomBinder : SerializationBinder {
public override Type BindToType(string assemblyName, string typeName) {
Type typeToDeserialize = null;
if (typeName.IndexOf("SomeType") != -1) {
typeToDeserialize = typeof(Foo.Bar.Bax.NewType);
}
else if (typeName.IndexOf("SomeOtherType") != -1) {
typeToDeserialize = typeof(Foo.Bar.Bax.SomeOtherNewType);
}
else {
// ... etc
}
return typeToDeserialize;
}
}
Run Code Online (Sandbox Code Playgroud)
Binder在反序列化之前设置您正在使用的格式化程序的属性,以便它覆盖默认值.
请注意,我不是在这里提供插件解决方案,我建议如何解决问题.一旦你转换出你正在做的任何事情,调查其他序列化技术,如protobuf,或编写自己的.无论哪种方式,您都不应该依赖CLR来获得长期的序列化支持.