DataContractSerializer:为什么不删除成员?

时间:2009-05-13 11:43:00

标签: .net serialization versioning datacontractserializer backwards-compatibility

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

  

请勿删除更高版本中的数据成员,即使 IsRequired 属性在以前的版本中保留为 false 的默认属性。

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

我认为,差异在于您应该在最后添加新成员(使用DataMemberAttribute上的Order属性),而删除的属性可能不会在最后。但是他们也说缺失的成员在加载过程中会保留默认值,所以很明显缺少的成员都可以。

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

另外,如果我认为我对前向兼容性不感兴趣(即,如果我不关心旧版本打开更新的文件),那么这些问题是否仍然适用?

2 个答案:

答案 0 :(得分:2)

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

因此,如果您的服务消费者都是已知的,只要您愿意,您就可以根据自己的意愿轻松操纵数据成员:

  • 不要破坏消费者或
  • 正确告知他们的变更

答案 1 :(得分:2)

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

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

如果调用者使用extra属性传递旧对象,则可能需要返回该值。您可以使用extension data API启用此功能(单独),但坦率地说,人们很少会为此烦恼。