添加新的XML元素,但仍然读取旧版本的XML文档

本文关键字:XML 读取 版本 文档 元素 添加 | 更新日期: 2023-09-27 17:53:27

在我的应用程序的版本1中,我有一个XML文档,看起来像这样:

<settings>
  <background>black</background>
</settings>

使用我像这样序列化和反序列化的元素:

[XmlElement("background")]
public string XMLbackground {
    get { return backgroundcolor; }
    set { backgroundcolor = value; }
}

但是现在在版本2中,我想为背景元素添加新的子元素:

<settings>
  <background>
    <color>black</color>
    <angle>62</angle>
  </background>
</settings>

这意味着背景元素不再是一个字符串,而是一个类。

[XmlElement("background")]
public BackgroundSettings background = new BackgroundSettings();
//...
public class BackgroundSettings
{
[XmlElement("color")]
public string XMLcolor {
    get { return backgroundcolor; }
    set { backgroundcolor = value; }
}
[XmlElement("angle")]
public string XMLangle {
    get { return backgroundangle; }
    set { backgroundangle = value; }
    }
}

我如何继续用现在使用标准。net序列化标记创建和读取版本2格式的相同代码读取版本1 XML文档?

添加新的XML元素,但仍然读取旧版本的XML文档

我认为最好将"version=x"添加到文档的根目录,并在反序列化之前进行检查。然后,您必须在代码中保留两个版本的数据对象——ConfigV1和ConfigV2。根据"version=x"的值,将xml反序列化为ConfigV1或ConfigV2实例。实现从ConfigV1到ConfigV2的手动转换,在对象是ConfigV1的情况下调用。

如果您只是添加字段,则不需要这样做,因为反序列化应该只是跳过xml中缺少的字段并保留默认值。

或者,您可以通过实现isserializable和构造函数来实现自定义反序列化(我没有尝试,您必须自己尝试):

Config(SerializationInfo info,StreamingContext context) {
    this.angle = info.GetString("angle");
    ...
}