2011-04-26 35 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"); 
    ... 
}