【发布时间】:2009-10-03 12:12:45
【问题描述】:
阅读Data Contract Versioning 后,我们得出结论,这并不是故事的全部。例如,如果您以前有 ValueA,而在新版本中它现在称为 ValueB 并且属于不同类型,您需要将 ValueA 转换为 ValueB,会发生什么?
我可以使用一些 callbacks 来帮助解决这个问题,但如果我们期望格式在很长一段时间内频繁更改,它看起来不是一个非常易于维护的解决方案。
我们确定的解决方案是保留“按版本保存”字段,并在加载文件时根据需要调用特定于旧版本的转换例程。这些转换例程知道如何将旧数据的 XML 转换为新数据的 XML。
然而,事实证明,DataContractSerializes requires the order of the elements to be exactly what it expects。这意味着我们的转换过程必须知道将元素插入到准确正确的位置。如果考虑到继承,这比简单地添加具有已知名称的元素要困难得多。使用继承,您不能可靠地使用AddBeforeSelf 或AddAfterSelf any 字段,因为没有一个字段始终紧邻这个新字段。
撇开 DataContractSerializer 如此严格的原因不谈,您能否提出解决方法?也许是一篇关于如何与非常旧的数据合约保持向后兼容的好文章,在您对格式进行第 100 次重大更改时不会变得笨拙。
this article 中有一些额外的指导方针,但这一定是为了不同的目的而编写的。例如,我们不可能让旧数据成员永远闲逛(第 9 点)。似乎大多数此类文章都是从通信协议的角度编写的,而不是将数据存储在文件中。
【问题讨论】:
标签: .net datacontractserializer