public class Item{}
现在我有一个名为ItemWrapper的新类,它从Item附加了一个属性:
public class ItemWrapper : Item { public string NewProperty { get; set; } }
现在我的序列化/反序列化方法使用ItemWrapper类型.现在我已经破坏了向后的兼容性.我无法加载保存在旧版本中的Item类型的任何XML文件.我考虑在反序列化方法中尝试反序列化Item作为ItemWrapper,然后在catch中,然后尝试将它反序列化为Item.或者我可以xPath来查看XML结构,如果没有找到ItemWrapper,我可以把它当作Item.这两种解决方案都感觉到黑客,我相信有一个更好的方法来处理这种情况.有任何想法吗?
解决方法
如果您需要保留两个结构,则ItemWrapper需要使用几个属性进行装饰,以指示XMLSerializer如何转换为XML字符串和从XML字符串转换.有关XML属性的信息可以在here中找到.
特别是,我提请您注意XmlTypeAttribute.它装饰ItemWrapper类本身,并告诉XmlSerializer使用特定的命名空间和类型名称,而不是根据类名称自动生成它们.您可以使用它来使ItemWrapper与通过序列化Item创建的XML文件兼容,指出ItemWrapper类应该创建并使用标记为< Item>的XML序列号.但是,如果仍然存在,则当尝试反序列化序列化ItemWrapper所创建的文件时,“项目”将失败,因此该解决方案不会向前兼容,因此,如果尚未稳健地处理序列化错误,则以前版本的软件,当给出较新的文件时,没有明显的理由会死亡
因此,在序列化中实现某种版本控制方案通常是一个好主意.它可以像您的类型上的公共只读属性一样简单,可以使用XmlAttribute属性标记,告诉XmlSerializer构建< Item>标签为< Item xmlVersion =“1.0.0”> ;.如果您已经完成了这个操作,那么ItemWrapper可以覆盖该字段以返回“1.1.0”,允许XML文件容易区分,因此允许您使用XmlTextReader检查不兼容的文件版本,并正常返回错误如果该文件是由更高版本的软件生成的.