2010-06-29 69 views
1

由於平臺供應商需要將存儲機制放在XElement對象中,而不是存儲在我的數據庫中創建的數據表中,因此我正在重寫項目。這變得很痛苦,我需要一些見解。以編程方式升級XML Schema

我可以使用XmlSerializer將我的對象圖形變爲/從Xml中讀取/從我給出的XElement對象中讀取/寫入,但我不知道如何在需要更改時升級Xml數據對象圖。

有沒有人遇到過這個問題,哪些文章已經證明最好的學習如何構建這樣的更新方法。謝謝。

+0

我是否理解在更改類的定義時要更新XML數據,而無需重新序列化? 這聽起來很棘手...... – Mau 2010-06-29 13:21:01

+0

是的。這正是我想要做的。我試圖弄清楚這一點,因爲我沒有選擇,只能用這種方法來處理。我記得有一種方法可以重載序列化/反序列化方法,並且曾經認爲有人在過去做過這個來解決這個問題。 – 2010-06-30 17:23:55

+0

這個想法是當我需要改變定義的時候,我可以運行一個腳本來將舊的XML格式讀入內存,製作需要的變形,然後序列化爲新的XML格式。 – 2010-06-30 17:25:03

回答

1

我一直在這種令人沮喪的情況...... 我認爲這不能使用XmlSerializer完成。 XmlSerializer編譯一個在當前類型層次結構周圍定製的序列化例程。如果您更改太多,則XML將與新的類結構不兼容。

我不認爲會產生任何XML模式,唯一的'模式'是編譯的特設XML序列化程序代碼。

可以你想通過 1)創建類,反映您的變更, 2)deserialising的XML到老班什麼, 3)採用新老對象之間的變形, 4)序列化的新對象, 5)改變了類名的舊的, 6)在XML取代Temp名稱,

但它是非常痛苦的(儘管它可能是不錯的方法一次性) 。

如果你需要應付頻繁變動(或者,如果你使用序列不友好的編譯器像目前的F#之一),這裏最好的辦法是自己的XmlSerializer(可能使用Linq2XML)來編寫能夠與代碼應付變化。

+0

嗯..您可以詳細說明使用Linq2Xml並構建自己的XmlSerializer的想法嗎?聽起來像我在想的路線,但不知道整個Linq2Xml的東西。 我在想,如果主對象可以擁有「版本」屬性,也許可以將其用作升級腳本的一部分,無論這可能是什麼。 – 2010-07-01 03:20:58