gpt4 book ai didi

c# - 反序列化向后兼容性

转载 作者:可可西里 更新时间:2023-11-01 03:13:40 24 4
gpt4 key购买 nike

我正在尝试使用旧版本的应用程序反序列化“SomeClass”。我得到以下异常

System.Runtime.Serialization.SerializationException: The ObjectManager found an invalid number of fixups. This usually indicates a problem in the 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;
}

鉴于我无法更改版本 0.8,我应该如何向 Foo 对象添加更多状态,以便以前的版本可以反序列化任何它们可以反序列化的内容?

任何指针将不胜感激。

更新 1Bar 和 Zoo 是其他可序列化的类,包含哈希表和其他可序列化的东西。这些类中的所有内容都是可序列化的。另外,我没有任何支柱。

最佳答案

首先,永远不要将 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;
}
}

在反序列化之前设置您正在使用的格式化程序的 Binder 属性,以便它覆盖默认值。

请注意,我在这里不是提供直接解决方案,而是建议如何解决问题。一旦你从你正在做的任何事情中转换出来,研究其他序列化技术,比如 protobuf,或者编写你自己的。无论哪种方式,您都不应该依赖 CLR 来提供长期序列化支持。

关于c# - 反序列化向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5381928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com