C# 序列化:是否会更改基础类?

C# 序列化:是否会更改基础类?,c#,class,serialization,C#,Class,Serialization,我正试着把我的头绕在序列化上。但是如果出于任何原因我需要添加或删除一些值或属性,会发生什么呢?这将如何影响内容?或者这不是一个问题?或者如何避免这种情况?这完全取决于您使用的序列化技术以及是否计划对遗留对象进行反序列化 我相信,如果您添加或删除属性,并且仍然希望反序列化对象的旧版本,则可能会遇到一些问题,具体取决于您正在执行的序列化类型 对于BinaryFormatter和SoapFormatter: 如果添加新属性,则需要使用修饰它们,以便仍然可以反序列化没有新字段的对象的旧版本 如果要“删

我正试着把我的头绕在序列化上。但是如果出于任何原因我需要添加或删除一些值或属性,会发生什么呢?这将如何影响内容?或者这不是一个问题?或者如何避免这种情况?

这完全取决于您使用的序列化技术以及是否计划对遗留对象进行反序列化

我相信,如果您添加或删除属性,并且仍然希望反序列化对象的旧版本,则可能会遇到一些问题,具体取决于您正在执行的序列化类型

对于BinaryFormatterSoapFormatter

  • 如果添加新属性,则需要使用修饰它们,以便仍然可以反序列化没有新字段的对象的旧版本
  • 如果要“删除”属性,则必须将它们保留在代码中,但要用修饰它们,以便仍然可以反序列化仍然具有已删除字段的对象的旧版本

这完全取决于您使用的序列化技术,以及您是否计划对遗留对象进行反序列化

我相信,如果您添加或删除属性,并且仍然希望反序列化对象的旧版本,则可能会遇到一些问题,具体取决于您正在执行的序列化类型

对于BinaryFormatterSoapFormatter

  • 如果添加新属性,则需要使用修饰它们,以便仍然可以反序列化没有新字段的对象的旧版本
  • 如果要“删除”属性,则必须将它们保留在代码中,但要用修饰它们,以便仍然可以反序列化仍然具有已删除字段的对象的旧版本

我可以为XmlSerializer说话,因为它在我自己的项目中被广泛使用


添加属性不会导致XmlSerializer出现任何问题,序列化xml中缺少的属性只会保留其默认值。删除或重命名现有属性只会导致数据丢失。除非将原始xml作为xml或文本文件处理,否则删除或重命名的属性中的数据将丢失。使用XmlSerializer时,不需要特殊属性来添加、删除或重命名属性。

我可以为XmlSerializer说话,因为它在我自己的项目中广泛使用


添加属性不会导致XmlSerializer出现任何问题,序列化xml中缺少的属性只会保留其默认值。删除或重命名现有属性只会导致数据丢失。除非将原始xml作为xml或文本文件处理,否则删除或重命名的属性中的数据将丢失。使用XmlSerializer时,不需要特殊属性来添加、删除或重命名属性。

正如人们已经指出的,这取决于您的序列化程序<代码>XmlSerializer在这种情况下更容易处理:

  • 序列化程序针对公共接口工作,因此如果更改实现,则不会出错
  • XML是人类可读的,因此很容易手工或使用一些XML实用程序进行解析。因此,如果其他一切都出错,您可以编写一个版本转换器

  • 考虑Jon的anwer获得更多提示,尤其是关于
    非序列化
    OptionalField
    属性的提示。

    正如人们已经指出的,这取决于您的序列化程序<代码>XmlSerializer在这种情况下更容易处理:

  • 序列化程序针对公共接口工作,因此如果更改实现,则不会出错
  • XML是人类可读的,因此很容易手工或使用一些XML实用程序进行解析。因此,如果其他一切都出错,您可以编写一个版本转换器

  • 更多提示请参考Jon的anwer,尤其是
    非序列化
    OptionalField
    属性。

    这取决于您使用的序列化机制。二进制格式化程序?XmlSerializer?Json.NET?这是一个相当复杂的话题。哦,对不起。我使用XmlSerializer进行学习,然后计划使用BinaryFormatter进行SQL存储。这比我想象的要复杂,我想是吧?我强烈建议您不要使用BinaryFormatter for SQL存储—它(IMO)不适合在任何时间段内进行存储。我谦恭地提出protobuf net可能是一个更好的选择(我是作者;它是免费的,等等,并且是专门为避免BinaryFormatter中的许多问题而设计的),这取决于您使用的序列化机制。二进制格式化程序?XmlSerializer?Json.NET?这是一个相当复杂的话题。哦,对不起。我使用XmlSerializer进行学习,然后计划使用BinaryFormatter进行SQL存储。这比我想象的要复杂,我想是吧?我强烈建议您不要使用BinaryFormatter for SQL存储—它(IMO)不适合在任何时间段内进行存储。我谦恭地提交protobuf net可能是一个更好的选择(我是作者;它是免费的,等等,并且专门为避免BinaryFormatter中的许多问题而设计)