2011-04-26 45 views
2

在我的应用程序的版本1,我有一个看起来像这样的XML文档:添加新的XML元素和仍读旧版本的XML文档

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

随着我序列化和反序列化这样一个元素:

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

但是现在在2.0版本我想新的子元素添加背景要素:

<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文档?

+0

是否执行从字符串到BackgroundSettings隐式转换帮助? – 2011-04-26 02:45:53

+0

对于你来说答案是否足够,还是你还在等待更多答案?您可以评论答案或接受答案。 – 2011-04-27 11:22:55

回答

1

我会说这是一个好主意,将“version = x”添加到文档的根目录,并在反序列化之前检查它。然后,您必须在代码中保留两个版本的数据对象 - ConfigV1和ConfigV2。根据“version = x”的值,将xml反序列化为ConfigV1或ConfigV2实例。如果对象是ConfigV1,则执行从ConfigV1到ConfigV2的手动转换。

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

或者,您也可以通过实施了ISerializable和构造实现自定义序列化(我没有尝试这一点,你就必须自己尝试一下):

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