【发布时间】:2014-10-22 15:05:23
【问题描述】:
标题几乎说出了我想知道的内容。我有二进制序列化的数据,现在我再次读取它(类名保持不变),我想知道序列化程序是否遗漏了什么,例如,可能已重命名私有支持字段。
我做了以下重构:
private string descriptionField;
public string Description
{
get { return this.descriptionField; }
}
到
public string Description { get; private set; }
正如in this article 中所述,这是行不通的。但是我真的很想知道是否有办法检测类是否与序列化数据不匹配。
我不想通过实现ISerializable 自己进行序列化,因为该类及其属性非常大并且可能会被更改。我更喜欢更简单的解决方案 =)
【问题讨论】:
-
捕获它会抛出的异常,但您不能对尚未序列化的字段执行任何操作(只需提供有意义的默认值)。当然,如果您实施
ISerializable,您将对此有更大的控制权(您知道您在阅读什么:如果一个字段没有被存储,那么它将不会被初始化,只需在每次读取之前检查)。 -
问题是,它不会抛出异常,改变的字段名只是用它的默认值初始化
-
如果你 rename 某些东西,那么它会抛出,因为找不到旧的变量名。如果你 add 什么都不会发生。在这种情况下,它们将只有默认值。在这里你可以做一些实现 ISerializable 的事情。在构造函数中,您将手动读取字段,您可以检查它们是否在序列化数据中可用。如果不是,您没有阅读它们,但您也知道它(这也是管理版本控制的一种非常原始的方式)。
-
正如我所说,我提供的示例不会引发异常。隐式重命名是因为后台字段将由编译器在后台生成(我使用了
BinaryFormatter)。我也不想使用ISerializable,因为班级很大 -
想想
OptionalFieldAttribute!它的存在是因为BinaryFormatter可能 在这种情况下抛出。这不是它的默认行为,启用它将BinaryFormatter.AssemblyFormat设置为FormatterAssemblyStyle.Full。也就是说,这不是管理这些东西的正确方法...ISerializable是,即使写起来很烦人(嗯,BinaryFormatter- 但一般来说序列化 - 不是正确的选择跨版本保留应用程序数据,除非您正在做一些非常琐碎的事情)。
标签: c# serialization binary-serialization