2010-06-29 46 views
2

我使用DataContractSerializer將具有DataContract和DataMember屬性的類序列化爲XML文件。我的課程稍後可能會更改,因此序列化文件的格式也可能會更改。我想標記我用一個版本號保存的文件,所以我至少知道每個文件來自哪個版本。我仍在決定如何以及如果我想添加將舊文件格式的文件遷移到更新格式的功能。但是現在,我只能確定版本不匹配而感到高興。我是否應該使用XML文件的名稱空間來標識其版本

XML文件的名稱空間是否存儲文件版本的正確位置?我正在考慮按照以下方式將DataContract屬性歸類。

[DataContract(Name="MyClass",Namespace="http://www.mycompany.com/MyProject/1.0 
public class MyClass 
    ... 

再後來,如果MyClass的變化我想改變命名空間...

[DataContract(Name="MyClass",Namespace="http://www.mycompany.com/MyProject/2.0)] 
public class MyClass 
    ... 

這是XML命名空間的正確使用,還是有另一種更首選的方式來保存XML版本文件?

回答

3

您可以這樣做,但是隨後XML Infoset的觀點(其中名稱空間是元素的限定名稱的一部分)中的數據的XML表示會變得完全不同,因此您既沒有後退也沒有前向兼容性。

現在,XML所具有的一個優點是,它可以通過XPath和XSLT等技術以前向兼容的方式輕鬆處理 - 您只需選擇可以解釋的元素,並留下任何您不認識的東西。但是這需要具有相同含義的元素才能在版本之間保留相同的名稱(包括名稱空間)。

一般來說,最好是使你的模式forward-compatible。如果你無法做到這一點,你可能仍然希望提供與現有工具儘可能多的兼容性(對於只讀取數據的工具而不是寫入它的工具來說,兼容性往往更容易)。因此,你避免在這種情況下存儲版本號,只是試圖解析你給的任何東西,如果輸入肯定是畸形的,則表示錯誤。

如果您認爲必須在兩個方向上都打破兼容性並從乾淨的版本開始,那麼爲WCF數據合約處理此問題的建議方式實際上是通過更改名稱空間來實現的,如best practices on data contract versioning中所述。還有一些小的變化,例如在URL中使用發佈日期而不是版本號(W3C對他們的模式非常喜歡),但這些主要是風格化的。

+0

正是我在找的東西。謝謝! – 2010-07-01 18:40:42

相關問題