添加新的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文档?
我认为最好将"version=x"添加到文档的根目录,并在反序列化之前进行检查。然后,您必须在代码中保留两个版本的数据对象——ConfigV1和ConfigV2。根据"version=x"的值,将xml反序列化为ConfigV1或ConfigV2实例。实现从ConfigV1到ConfigV2的手动转换,在对象是ConfigV1的情况下调用。
如果您只是添加字段,则不需要这样做,因为反序列化应该只是跳过xml中缺少的字段并保留默认值。
或者,您可以通过实现isserializable和构造函数来实现自定义反序列化(我没有尝试,您必须自己尝试):
Config(SerializationInfo info,StreamingContext context) {
this.angle = info.GetString("angle");
...
}