C# 检查二进制序列化数据是否与序列化它的类匹配

C# 检查二进制序列化数据是否与序列化它的类匹配,c#,serialization,binary-serialization,C#,Serialization,Binary Serialization,这个标题几乎是我想知道的。我有一个二进制序列化的数据,现在我再次读取它(类名保持不变),我想知道序列化程序是否遗漏了一些内容,例如,一个私有备份字段可能已重命名 我进行了以下重构: private string descriptionField; public string Description { get { return this.descriptionField; } } 到 如本文所述,这是行不通的。但是我真的想知道是否有一种方法可以检测类是否与序列化数据不匹配 我不想自己通过实

这个标题几乎是我想知道的。我有一个二进制序列化的数据,现在我再次读取它(类名保持不变),我想知道序列化程序是否遗漏了一些内容,例如,一个私有备份字段可能已重命名

我进行了以下重构:

private string descriptionField;
public string Description
{
  get { return this.descriptionField; }
}

如本文所述,这是行不通的。但是我真的想知道是否有一种方法可以检测类是否与序列化数据不匹配

我不想自己通过实现
ISerializable
来进行序列化,因为类及其属性非常大,可能会被更改。我想要一个更简单的解决方案=)

但是我真的想知道是否有一种方法可以检测类是否与序列化数据不匹配

检测它的一种方法是使用与先前序列化文件中相同的数据序列化现有类,然后比较先前和当前序列化文件的数字指纹

我不想自己通过实现ISerializable来进行序列化,因为类及其属性非常大,可能会被更改


由于您正在使用BinaryFormatter并处理潜在的重大版本控制问题,我认为您唯一的选择是实现
ISerializable
,并自行处理反序列化,无论您是否喜欢。

捕获它将引发的异常,但您无法对未序列化的字段执行任何操作(只需提供一个有意义的默认值)。当然,如果您实现了
ISerializable
,您将对此有更大的控制权(您知道您在读什么:如果一个字段没有存储,那么它就不会被初始化,只需在每次读取之前检查)。问题是,它不会引发异常,更改的字段名只是用其默认值初始化。如果重命名某个名称,则会引发异常,因为找不到旧的变量名。如果添加某个名称,则不会发生任何情况。在这种情况下,它们只会有默认值。在这里,您可以执行一些实现ISerializable的操作。在构造函数中,您将手动读取字段,并可以检查它们在序列化数据中是否可用。如果不可用,则不读取它们,但您也知道它(这也是管理版本控制的一种非常原始的方法)。正如我所说,它不会引发我提供的示例的异常。会进行隐式重命名,因为后台字段将由编译器在后台生成(我使用了
BinaryFormatter
)。另外,我不想使用
ISerializable
,因为该类对
OptionalFieldAttribute
非常重要!它的存在是因为
BinaryFormatter
可能会在这种情况下抛出。启用它并不是它的默认行为,而是将
BinaryFormatter.AssemblyStyle
设置为
FormatterAssemblyStyle.Full
。也就是说,这不是管理这些内容的正确方法…
ISerializable
是,即使编写起来很烦人(好吧,
BinaryFormatter
——但在一般序列化中——不是跨版本持久化应用程序数据的正确选择,除非你做的是非常琐碎的事情)。我同意。反序列化程序怎么可能知道你重命名了什么?你最好自己做。我想我会选择你的第一个选项。在我们的例子中,我们已将索引数据序列化到硬盘以保存服务器调用。因此,我们将在应用程序启动时进行检查,这对一个文件来说是可以的。谢谢=)
public string Description { get; private set; }