【问题标题】:Will modifying shared methods change the class that reference them?修改共享方法会改变引用它们的类吗?
【发布时间】:2011-09-08 07:59:12
【问题描述】:

我想知道什么会真正改变一个类,因为这个类的序列化对象将不再被识别。

如果该类引用了另一个类的共享方法。更改此类共享方法是否也会更改引用它们的类?

如果将扩展方法更改为自定义类,会影响类“签名”吗?

【问题讨论】:

  • 很难准确地理解你在这里问什么。一个简短的代码示例展示您正在考虑的内容怎么样。
  • 我无法在代码中举例说明这一点。这只是一个关于类定义的问题。如果我更改了一个类,如果我尝试将它们加载/读取到使用新/更改的类构建的程序中,那么在更改之前序列化的此类的对象可能会产生异常。我只是问什么类型的更改会产生这种异常。任何改变?仅更改属性和字段?改变方法,引用其他类的静态方法?扩展模块?其中哪些会改变类定义,哪些不会?
  • 对扩展方法的更改应该对类完全没有影响,因为这些扩展方法不是类接口的一部分。它们只是使它们看起来成为类的一部分的语法糖。

标签: .net vb.net serialization


【解决方案1】:

这方面的一个很好的参考是 MSDN 上的 Version Tolerant Serialization。简而言之,对 Shared(C# 中的静态)方法的更改不会影响对象的反序列化:

  • 永远不要删除序列化的字段。

  • 如果该属性未应用于先前版本中的字段,则切勿将 NonSerializedAttribute 属性应用于该字段。

  • 切勿更改序列化字段的名称或类型。

  • 添加新的序列化字段时,应用 OptionalFieldAttribute 属性。

  • 从字段中删除 NonSerializedAttribute 属性(在以前的版本中不可序列化)时,应用 OptionalFieldAttribute 属性。

  • 对于所有可选字段,使用序列化回调设置有意义的默认值,除非可以接受 0 或 nullas 默认值。

顺便说一句:更改与序列化相关的某些特殊方法可能会影响反序列化。但你会做出有意识的决定来改变这些。

【讨论】:

  • 谢谢!我什至不知道这些属性的存在,所以我会继续阅读。
【解决方案2】:

数据改变时,序列化的对象也会改变。对方法的引用永远不会被序列化;它们是代码而不是数据的一部分。

【讨论】:

  • 我认为这不是我要问的。我在问我的类的哪些类型的代码更改将使以前的序列化对象无法被当前程序构建识别。我正在尝试了解如何对我的类进行编码,以避免在存档数据上运行自定义更新代码。
【解决方案3】:

如果您正在执行二进制序列化,更改被序列化的类的私有和公共属性将“破坏接口”。如果您使用 XML 或 JSON,更改公共属性将改变其序列化方式。方法不会被序列化,因此您可以更改它们并且它仍然可以工作(只要您不更改签名)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2010-10-11
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多