具有向后兼容性的Xml读取

时间:2013-07-01 07:12:09

标签: c# .net xml xml-serialization backwards-compatibility

我目前正在使用的XML是使用XML序列化程序(Serializing Class及其嵌套的计数器部分)直接形成的

此外,如果序列化程序直接处理新Property的添加,但问题出现在deletion of property (value Type)removal of and entire class or addition of class

我希望阅读旧的和新的XML文件....我似乎无法弄清楚如何...

过程

Expected XML upgrade process

某些方式

但我不认为这些对于可维护的代码是好的

1)制作自定义XML解析器(每次更改时都不会灵活,解析器必须更新并再次进行测试)。
2)使用多个模型然后从旧迁移到新的(采取必要的组件)
3)导出旧文件并导入新文件(这还需要另一个XML文件,可能与第2点相关)
4)任何其他方式(请建议)

我不熟悉XML及其版本控制。 对于这个或任何其他我可以用来代替XML的文件类型/数据库,XML也是一个不错的选择

这方面的任何帮助都会有所帮助。

2 个答案:

答案 0 :(得分:0)

我通常会按照您的解决方案“#2”来命名我的模型(Myapp.Models.V1.MyModel),这样您就可以保持与仍然使用旧模式的客户端的向后兼容性(或者在您的情况下,加载一个旧文件)。

根据注释中的建议,您可以使用根节点上的简单属性来确定版本,并使用xmlreader,甚至是文件第一行的简单正则表达式来读取版本号。

至于你的第二个问题,关于文件类型/ db,根据你的需要,我强烈建议你查看像MongoDB或RavenDB这样的文档数据库,因为实现很简单/简单,并且不需要使用ORM工具就像实体框架一样处理关注点的正确分离。如果您需要可移植的东西,在桌面应用程序“保存文件”的情况下,SqlLite是一个很好的基于文件的数据库,但您可能希望使用ORM将模型映射到数据库。

链接:

答案 1 :(得分:0)

在大多数情况下,XmlSerializer已经内置了非常好的版本支持。在大多数情况下,如果添加或删除元素,则不会出现问题:额外(意外)数据将被忽略 - 或者放入进入[XmlAnyElement] / [XmlAnyAttribute]成员(如果有)进行往返。任何缺失的数据都不会被初始化。唯一值得注意的问题是子类型,但添加和删除子类型(或整个类型)对于任何序列化程序来说都是相当基础的。在子类型的情况下,一个常见的选择是:使用单个模型,但只是不删除任何子类型(假设您不需要向前兼容,添加子类型就可以了)。但是,如果不可能,多个模型(每个版本的模型)并不是一个坏方法。