我想圍繞序列化我的頭。但是,如果出於任何原因需要添加或刪除一些值或屬性,會發生什麼?這將如何影響內容?或者這不是一個問題?或者我該如何避免這種情況?序列化:是否會改變基礎類是一個問題?
2
A
回答
2
正如人們已經指出的那樣,它取決於您的序列化程序。 XmlSerializer
是比較容易在這種情況下處理:
- 串行器的工作原理對公共接口,所以如果你改變實現,一切正常。
- XML是人類可讀的,因此很容易用手或用一些XML實用程序來解析。因此,如果一切出錯,您可以編寫一個版本轉換器。
考慮Jon的更多提示,更多的提示,特別是與NonSerialized
和OptionalField
屬性。
1
這一切都取決於您正在使用的序列化技術,以及您是否計劃反序列化遺留對象。
我相信你可能遇到一些問題,如果你添加或刪除屬性,仍然想反序列化舊對象的版本,這取決於你正在做什麼類型的序列化。
對於的BinaryFormatter和SoapFormatter:
- 如果要添加新的屬性,你需要用OptionalField Attribute來裝飾它們,這樣你仍然可以反序列化老版本的對象沒有這樣的新的領域。
- 如果您正在「刪除」屬性,則必須將它們留在代碼中,但用OptionalField Attribute裝飾它們,以便仍可反序列化仍舊具有已刪除字段的舊對象的舊版本對象。
1
我可以說XmlSerializer,因爲它在我自己的項目中廣泛使用。
添加屬性不會導致XmlSerializer出現任何問題,序列化xml中缺少的屬性將保持其默認值。刪除或重命名現有屬性的效果僅僅是數據丟失。除非您處理原始的xml AS xml或文本文件,否則刪除或重命名的屬性中的數據會丟失。在使用XmlSerializer時,不需要特殊的屬性來添加,刪除或重命名屬性。
相關問題
- 1. 排序一個數據幀基礎上多列 - 排序問題
- 2. 改變基礎系列dynamicilly
- 3. 是否有一個基礎控制器類的位置約定?
- 4. 是在Backbone.js的「變化」事件只是「參考基礎」轉變,而不是「基於價值」的改變
- 5. 在一個ViewSet中以每個對象爲基礎更改序列化程序?
- 6. 基類是不反序列化
- 7. 是否可以訪問wxHaskell中的基礎Window類型?
- 8. C#,爲什麼XmlSerializer會序列化基礎對象而不是接口?
- 9. 測試變量是否可序列化
- 10. 類序列化問題
- 11. 如何檢查一個類是否是[incr Tcl]中的另一個類的基礎?
- 12. 有沒有辦法找出一個類是否是另一個類的直接基礎?
- 13. numpy:int是一個基礎字符串?
- 14. 關於JavaScript基礎的幾個問題 - $,「不是函數」
- 15. C# - 基礎類設計問題
- 16. 平變化與基礎即
- 17. 是否有一個用C#+ ASP.NET實現國際化的基礎教程?
- 18. 基礎機構和序列化
- 19. 另一個包裝的基礎流是否會導致數據丟失?
- 20. 從基類到派生類的序列化xml問題
- 21. DropDown列出問題ZURB基礎
- 22. 序列化到流是否
- 23. 是否可以改變monadic序列中的monad類型?
- 24. 是否有一個C#枚舉的基礎對象?
- 25. 枚舉類型佈局是否與其基礎類型兼容?
- 26. Gnuplotting改變軸的基礎
- 27. 另一個序列化問題
- 28. 使用boost :: serialization時,是否應該對沒有成員變量的基礎對象進行序列化?
- 29. 列表大小的基礎上改變CSS類
- 30. 混淆是否會改變變量/函數類型
這取決於您使用的序列化機制。 BinaryFormatter的? XmlSerializer的? Json.NET?這是一個適度複雜的話題。 –
對不起。我正在使用XmlSerializer進行學習,然後計劃轉移到用於SQL存儲的BinaryFormatter。這比我想象的更復雜,我接受了嗎? –
我強烈建議你**不要**移動到BinaryFormatter的SQL存儲 - 它不是(IMO)非常適合存儲在任何持續時間。我虛心地提交protobuf-net可能是一個更好的選擇(我是作者;它是免費的,等等,並且專門設計以避免BinaryFormatter中的許多問題) –