【问题标题】:DataContractSerializer: why not remove members?DataContractSerializer:为什么不删除成员?
【发布时间】:2010-10-25 20:13:06
【问题描述】:

我正在阅读微软的Best Practices: Data Contract Versioning,他们说:

即使 IsRequired 属性在之前的版本中保留为默认属性 false,也不要在以后的版本中删除数据成员。

任何人都可以提出任何理由吗?他们没有详细说明。由于他们说可以在以后的版本中添加数据成员,因此删除似乎也可以 - 实际上,旧版本会将其视为添加。

我想,不同之处在于您应该在最后添加新成员(使用 DataMemberAttribute 上的 Order 属性),而被删除的属性可能不会在最后。但是他们也说在加载的时候丢失的成员会保持默认值,所以很明显,丢失的成员是可以的。

我错过了什么?如果我废弃了我的产品的某个功能并删除了与之相关的 [DataMember] 属性,我会导致哪些版本互操作问题(向前兼容和向后兼容)?

另外,如果我决定对前向兼容性不感兴趣(即,如果我不担心旧版本会打开新文件),是否还会存在此类问题?

【问题讨论】:

    标签: .net serialization versioning datacontractserializer backwards-compatibility


    【解决方案1】:

    仅仅是因为外部服务消费者可能会提供/使用该数据(它们是在您删除某些成员之前创建的)。如果您更改了服务方法签名,DataContractSerializer 将无法再识别DataContract,因为未知数据成员。

    因此,如果您的服务消费者都是已知的,那么您可以轻松地随意操作数据成员,只要您:

    • 不要破坏消费者或
    • 适当通知他们更改

    【讨论】:

      【解决方案2】:

      一个问题是,即使它在序列化/反序列化期间没有中断,您也可能会丢弃数据 - 这意味着您无法成功地将数据往返返回给调用者。即给出简单的方法:

      public SomeType Echo(SomeType obj) {
          return obj;
      }
      

      如果调用者向您传递带有额外属性的旧对象,他们可能希望返回该值。您可以(单独)使用extension data API 启用此功能,但坦率地说,人们很少会为此烦恼。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多