加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#XML序列化向后兼容

发布时间:2020-12-16 05:27:36 所属栏目:百科 来源:网络整理
导读:以前,序列化/反序列化方法使用的类型是Item: public class Item{} 现在我有一个名为ItemWrapper的新类,它从Item附加了一个属性: public class ItemWrapper : Item{ public string NewProperty { get; set; }} 现在我的序列化/反序列化方法使用ItemWrapper
以前,序列化/反序列化方法使用的类型是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检查不兼容的文件版本,并正常返回错误如果该文件是由更高版本的软件生成的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读