5

我正在阅读 Microsoft's Best Practices: Data Contract Versioning,他们指出:

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

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

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

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

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

4

2 回答 2

2

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

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

  • 不要破坏消费者或
  • 正确告知他们更改
于 2009-05-13T12:19:01.157 回答
2

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

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

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

于 2009-05-13T12:22:29.577 回答