自定義序列化的.NET的方式,完全定製的系列化,只是標記班,只是打標類和添加了一些調整,一應俱全:
自定義序列時非常有用:
- 對象是完全或部分不可變的(一個或多個成員爲
readonly
),因此必須通過構造函數反序列化(工廠方法也可以通過調用當前構造函數來工作)。
- 一個圖很複雜,但其中的大部分內容都可以通過系統知識來簡化(例如「我知道我不需要將該成員完全序列化,我只需將序列化足夠的信息創建一個反序列化的新實例」。
- 通用類是在一個特定的方式使用(當然,他們總是...)和那些細節的知識,可以降低圖形的複雜性。
- 你是做哪繼承的類的XMLSeriazation或實現一個模板類或抽象自身參數化(這在映射圖時進入無限循環,至少在
IEnumerable<T>
,我不知道它是否發生在所有這樣的接口,我敢肯定它不會發生二進制序列化 - 真的這是一個錯誤,應該b e固定,但暫時在那裏)。
- 您需要保證向後兼容和/或轉發與課程後續版本的兼容性(由您來確保可行,但如果您不在「內部」,則不會有任何希望)。
- 您有一個不能編輯的框架或第三方提供的類的成員,因此您需要提供自己的序列化方法。
ISerialisable將提供一個抽象(命名的東西進來,命名的事情出來),這反過來又用於不同的格式。
如果你需要一個非常特定的格式(例如在特定模式下進行序列化),那麼你可能需要查看其他接口(例如IXmlSerializable),以便更明確地使用序列化方法,或忽略.NET-提供了序列化技術和滾動自己的手段來產生和解析不同的格式。
在另一個極端,您可以將[Serializable]
屬性放在該類以及它具有成員的任何類上,並且這些類將爲您提供默認序列化行爲。
進一步調整可能來自把[NonSerialized]
上不應序列成員(說你有BigObject _big; int _bigID
和它的基礎上_bigID
第一次訪問延遲加載memoise訪問_big
。在這種情況下,你可以只連載通過_bigID
標記_big
非序列化。IDeserializationCallback
通過時,它剛剛被deserialisation創建告知你的類允許進一步的調整。
你能否詳述一下這些格式可能是什麼? Xml,csv等? – theburningmonk 2010-08-20 09:58:30
@theburningmonk。 ISerializable可以使用包含「我們還沒有發明的東西」的格式。 – 2010-08-20 10:03:05
當然,它們是專有格式。一個基於文本的表示使用特殊的代碼和標識符來標識數據類型和變量,另外兩個是二進制格式。沒有XML或CSV - 我希望這很容易! :) – nukefusion 2010-08-20 10:04:38