閱讀Data Contract Versioning後,我們得出結論:這並不是真正的全部內容。例如,如果您曾經擁有ValueA,會發生什麼情況,並且在新版本中它現在稱爲ValueB並且是不同類型的,您需要將ValueA轉換爲ValueB?使用DataContractSerializer進行版本控制的簡單數據文件
我可以使用一些callbacks來幫助解決這個問題,但如果我們預計格式會在很長一段時間內頻繁更改,它看起來不是一個非常可維護的解決方案。
我們爲入駐的解決辦法是保持一個「的版本保存的」現場,並在加載文件調用特定舊版本的轉換程序的要求。這些轉換例程知道如何將舊數據的XML轉換爲新數據的XML。
但是,事實證明,DataContractSerializes requires the order of the elements to be exactly what it expects。這意味着我們的轉換過程必須知道將元素插入到正好是的正確位置。如果考慮繼承,這比簡單地添加一個已知名稱的元素要困難得多。有了繼承,你不能可靠地或AddAfterSelf
任何場,僅僅是因爲沒有一個單一的領域,始終是旁邊這個新領域。
撇開DataContractSerializer做得如此嚴格的原因,你能否提出解決方法?也許是一篇關於如何保持與舊數據合同向後兼容的偉大文章,在您對格式進行第100次重大更改時不會變得笨拙。
有在this article一些額外的指導方針,但必須用於不同的目的已經被寫入。例如,我們不可能讓舊數據成員永遠懸掛(第9點)。看來,大多數這樣的文章是從通信協議的角度來編寫的,而不是將數據存儲在文件中。
這是一個非常大的合同;我真的很討厭複製和粘貼大部分內容,只是爲了將bool「Enabled」更改爲枚舉「狀態」。我將堅持使用XML預處理,儘管存在問題中描述的問題,但它實際上很容易實現。 – 2009-10-04 10:28:45