【问题标题】:Deserializing legacy (binary) file after refactoring重构后反序列化遗留(二进制)文件
【发布时间】:2010-09-15 00:10:05
【问题描述】:

我正在尝试重新组织我的应用程序的命名空间层次结构,因此我使用System.Runtime.Serialization.SerializationBinder 子类来尝试处理重命名。 (我重命名的大多数类都正确反序列化到它们的新命名空间中,没有问题。)

我遇到的问题是 一个 我的序列化类(实现INotifyPropertyChanged)未能将PropertyChanged 事件标记为[field:NonSerialized](哎呀),所以遗留文件保留对该类的旧版Type 的引用(通过序列化委托)。

我已经在重命名的类上实现了ISerializable,以避免反序列化PropertyChanged 事件,但这似乎没有奏效——仍然会尝试实例化旧的(重命名的)类。

如何强制 BinaryFormatter 避免尝试反序列化委托?

【问题讨论】:

  • 如果我反序列化一个中间文件,其中 PropertyChanged 被标记为 NonSerialized,该文件被反序列化没有问题。

标签: c# delegates serialization


【解决方案1】:

看来,解决方案是在包含对Type 的引用的类上实现ISerializable,并手动管理哪些字段被序列化,以及如何序列化。这要求重构的类在原始命名空间中保留一个类存根以进行中间构建,在该构建中,我们将遗留文件转换为新的(重构的)格式。向后兼容性无法恢复,但我们能够挽救有问题的文件。

【讨论】:

    【解决方案2】:

    委托可以在 OUTSIDE CLASSES 中声明是有原因的。

    【讨论】:

    • 这不是很有帮助。我知道 PropertyChanged 事件应该被标记为 [NonSerialized]。不是。我现在在问,我是否可以做些什么来避免破坏与设计不佳的序列化文件的向后兼容性。
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2014-10-16
    • 2023-03-10
    • 2014-11-28
    • 1970-01-01
    • 2020-03-07
    • 2016-01-14
    相关资源
    最近更新 更多