阅读数据合同版本控制后,我们得出结论,这并不是故事的全部。例如,如果您以前有 ValueA,而在新版本中它现在称为 ValueB 并且属于不同类型,您需要将 ValueA 转换为 ValueB,会发生什么情况?
我可以使用一些回调来帮助解决这个问题,但如果我们期望格式在很长一段时间内频繁更改,它看起来不是一个非常可维护的解决方案。
我们解决的解决方案是保留“按版本保存”字段,并在加载文件时根据需要调用特定于旧版本的转换例程。这些转换例程知道如何将旧数据的 XML 转换为新数据的 XML。
然而,事实证明,DataContractSerializes 要求元素的顺序完全符合它的预期。这意味着我们的转换过程必须知道将元素插入到正确的位置。如果考虑到继承,这比简单地添加具有已知名称的元素要困难得多。使用继承,您不能可靠地AddBeforeSelf
或AddAfterSelf
任何字段,这仅仅是因为没有一个字段始终位于该新字段旁边。
撇开 DataContractSerializer 如此严格的原因不谈,你能建议解决这个问题的方法吗?也许是一篇关于如何与非常旧的数据合约保持向后兼容的好文章,在您对格式进行第 100 次重大更改时不会变得笨拙。
本文中有一些额外的指导方针,但这一定是为了不同的目的而编写的。例如,我们不可能让旧数据成员永远闲置(第 9 点)。似乎大多数此类文章都是从通信协议的角度编写的,而不是将数据存储在文件中。