2012-01-31 25 views
0

我相信以下幾點:我可以向List成員添加[XmlElement]屬性而不破壞向後兼容性嗎?

public List<Vector3> Vectors; 

將系列化出來:

<Vectors> 
<Vector3> 
    <X>0</X> 
    <Y>0</Y> 
    <Z>0</Z> 
</Vector3> 
</Vectors> 

我想刪除裝盒標籤,我相信我可以這樣做:

[XmlElement("Vector3")] 
public List<Vector3> Vectors; 

哪應序列化爲:

<Vector3> 
    <X>0</X> 
    <Y>0</Y> 
    <Z>0</Z> 
</Vector3> 

但我恐怕會破壞仍在列表周圍使用「Vectors」標記的舊XML文件。有沒有一種常見的方法來解決這個問題?

編輯:上面的清單將是一個容器對象的一部分,所以完整的XML可能與

<Container> 

開始和結束

</Container> 

我離開了這一點原本保持的問題短。

+0

除了向後兼容性,您如何期望單個Vecotr3元素代表類似於列表的固有多值結構?如何表示具有單個XMLElement的XML中具有多於一個元素的向量? – 2012-01-31 01:28:33

+0

如果有多個元素,那麼每個元素將顯示爲它們在XML中指定的順序是它們在反序列化時將出現在列表中的順序 - 我相信這是相當標準的XML實踐。 – 2012-01-31 02:29:12

+0

不是有效的XML。 XML必須具有單個根元素,這就是爲什麼使用。 – 2012-01-31 02:33:00

回答

1

我不相信XML有任何內置的版本機制。我認爲你最好的選擇是編寫一些外部機制,它可以檢測你定義的「版本」並手動將舊版本反序列化到你的新對象中。您可能還需要定義一個新版本成員變量或屬性,以便在您再次遇到相同問題時序列化您的對象,因爲一旦您第二次更改架構,就會有3個版本值得擔心。

你可以通過你的對象定義IXmlSerializable的和定義的ReadXml /功能中WriteXML編寫自定義反序列化的方法,也可以使用一些外部的過程中產生基於舊版本的新XML格式。也許首先將XML文件加載到XmlDocument中,然後修改它的方式(即將Vector3節點向上移動並移除Vectors節點),然後將文檔的OuterXml值保存爲字符串並通過MemoryStream進行反序列化。