.net - DataContractSerializer:为什么不删除成员?

标签 .net serialization versioning datacontractserializer backwards-compatibility

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

Do not remove data members in later versions, even if the IsRequired property was left at its default property of false in prior versions.



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

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

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

另外,如果我决定我对向前兼容性不感兴趣(即,如果我不担心旧版本打开新文件),那么任何此类问题仍然适用吗?

最佳答案

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

所以如果你的服务消费者都是已知的,你可以很容易地随意操作数据成员,只要你:

  • 不要破坏消费者或
  • 正确通知他们更改
  • 关于.net - DataContractSerializer:为什么不删除成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/857486/

    相关文章:

    .net - NetSparkle 与 SparkleDotNET

    git - 删除已知提交 ID 的特定提交

    java - 在 Java Web 应用程序和库中包含版本信息的最佳实践?

    .net - 带有 permessage-deflate 的 IIS 8 WebSockets

    c# - 有没有可以将所有声明转换为完全限定类型的 C# 重构工具?

    java - boolean 类型序列化和反序列化单元测试失败

    python - Django REST 框架 API : PrimaryKeyRelatedField

    java - 如何使我的 MouseListeners 在反序列化的 JPanel 中工作?

    java - 如何克服 Spring 和 Jbehave 版本控制问题?

    c# - 使用 JSON.net 将内部数组反序列化为对象