C#XML序列化向后兼容

前端之家收集整理的这篇文章主要介绍了C#XML序列化向后兼容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以前,序列化/反序列化方法使用的类型是Item:
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.这两种解决方案都感觉到黑客,我相信有一个更好的方法来处理这种情况.有任何想法吗?

解决方法

好问题.首先,通过推导扩展类是对Open / Closed原则的良好遵守,如果Item的所有消费者现在都使用ItemWrapper,那么您没有节省很多精力来实现派生类.如果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”&gt ;.如果您已经完成了这个操作,那么ItemWrapper可以覆盖该字段以返回“1.1.0”,允许XML文件容易区分,因此允许您使用XmlTextReader检查不兼容的文件版本,并正常返回错误如果该文件是由更高版本的软件生成的.

原文链接:https://www.f2er.com/c/114746.html

猜你在找的C&C++相关文章