阅读Data Contract Versioning后,我们得出结论:这并不是真正的全部内容。例如,如果您曾经拥有ValueA,会发生什么情况,并且在新版本中它现在称为ValueB并且是不同类型的,您需要将ValueA转换为ValueB?使用DataContractSerializer进行版本控制的简单数据文件
我可以使用一些callbacks来帮助解决这个问题,但如果我们预计格式会在很长一段时间内频繁更改,它看起来不是一个非常可维护的解决方案。
我们为入驻的解决办法是保持一个“的版本保存的”现场,并在加载文件调用特定旧版本的转换程序的要求。这些转换例程知道如何将旧数据的XML转换为新数据的XML。
但是,事实证明,DataContractSerializes requires the order of the elements to be exactly what it expects。这意味着我们的转换过程必须知道将元素插入到正好是的正确位置。如果考虑继承,这比简单地添加一个已知名称的元素要困难得多。有了继承,你不能可靠地或AddAfterSelf
任何场,仅仅是因为没有一个单一的领域,始终是旁边这个新领域。
撇开DataContractSerializer做得如此严格的原因,你能否提出解决方法?也许是一篇关于如何保持与旧数据合同向后兼容的伟大文章,在您对格式进行第100次重大更改时不会变得笨拙。
有在this article一些额外的指导方针,但必须用于不同的目的已经被写入。例如,我们不可能让旧数据成员永远悬挂(第9点)。看来,大多数这样的文章是从通信协议的角度来编写的,而不是将数据存储在文件中。
这是一个非常大的合同;我真的很讨厌复制和粘贴大部分内容,只是为了将bool“Enabled”更改为枚举“状态”。我将坚持使用XML预处理,尽管存在问题中描述的问题,但它实际上很容易实现。 – 2009-10-04 10:28:45