2010-08-20 10 views
1

隨着我目前正在開發的應用程序,我遇到需要將一些業務對象序列化爲多種不同的專有格式。實現自定義序列化爲多種格式:ISerializable或自定義解決方案?

我正在努力就此問題做出決定,並希望得到一些意見。

我知道.NET爲我們提供了可以在我的業務對象上實現的ISerializable接口,但是我很難理解當我需要序列化爲3種不同格式時這將如何應對?

最重要的是,我並不太熱衷於將所有序列化特定代碼「粘在」我的漂亮乾淨的業務對象上 - 我寧願把這個責任歸咎於專用對象。當存在多種不同的格式時,這似乎也有意義,因爲序列化選項將來可以通過簡單地擴展基類或未修改業務對象本身來進行修改。再說一遍,我寧願不「重新發明輪子」。

我想知道你的集體經驗和意見是在這些情況下?

ISerializable多種格式的可行選項? 或者是更適合該任務的自定義類或服務? 是否有任何設計模式或覆蓋此區域的其他框架功能?

+0

你能否詳述一下這些格式可能是什麼? Xml,csv等? – theburningmonk 2010-08-20 09:58:30

+0

@theburningmonk。 ISerializable可以使用包含「我們還沒有發明的東西」的格式。 – 2010-08-20 10:03:05

+0

當然,它們是專有格式。一個基於文本的表示使用特殊的代碼和標識符來標識數據類型和變量,另外兩個是二進制格式。沒有XML或CSV - 我希望這很容易! :) – nukefusion 2010-08-20 10:04:38

回答

1

您可以使用ISerializable爲每個對象(SerializationInfo)獲取一種通用中間存儲數據的形式,然後可以爲該中間類型實現三個單獨的處理程序,將它們轉換爲最終形式。就我個人而言,我當然不希望在單個業務對象中看到三種形式的序列化代碼。

根據對象的數量和複雜程度,您可以更簡單地創建自己的界面,每個類都必須支持序列化。這樣可以使您獲得完全的靈活性,但代價是不能與標準序列化位一起使用。

1

自定義序列化的.NET的方式,完全定製的系列化,只是標記班,只是打標類和添加了一些調整,一應俱全:

自定義序列時非常有用:

  1. 對象是完全或部分不可變的(一個或多個成員爲readonly),因此必須通過構造函數反序列化(工廠方法也可以通過調用當前構造函數來工作)。
  2. 一個圖很複雜,但其中的大部分內容都可以通過系統知識來簡化(例如「我知道我不需要將該成員完全序列化,我只需將序列化足夠的信息創建一個反序列化的新實例」。
  3. 通用類是在一個特定的方式使用(當然,他們總是...)和那些細節的知識,可以降低圖形的複雜性。
  4. 你是做哪繼承的類的XMLSeriazation或實現一個模板類或抽象自身參數化(這在映射圖時進入無限循環,至少在IEnumerable<T>,我不知道它是否發生在所有這樣的接口,我敢肯定它不會發生二進制序列化 - 真的這是一個錯誤,應該b e固定,但暫時在那裏)。
  5. 您需要保證向後兼容和/或轉發與課程後續版本的兼容性(由您來確保可行,但如果您不在「內部」,則不會有任何希望)。
  6. 您有一個不能編輯的框架或第三方提供的類的成員,因此您需要提供自己的序列化方法。

ISerialisable將提供一個抽象(命名的東西進來,命名的事情出來),這反過來又用於不同的格式。

如果你需要一個非常特定的格式(例如在特定模式下進行序列化),那麼你可能需要查看其他接口(例如IXmlSerializable),以便更明確地使用序列化方法,或忽略.NET-提供了序列化技術和滾動自己的手段來產生和解析不同的格式。

在另一個極端,您可以將[Serializable]屬性放在該類以及它具有成員的任何類上,並且這些類將爲您提供默認序列化行爲。

進一步調整可能來自把[NonSerialized]上不應序列成員(說你有BigObject _big; int _bigID和它的基礎上_bigID第一次訪問延遲加載memoise訪問_big。在這種情況下,你可以只連載通過_bigID標記_big非序列化。IDeserializationCallback通過時,它剛剛被deserialisation創建告知你的類允許進一步的調整。

0

聽起來像是你需要爲每一個你想你的對象序列化格式的自定義序列。正如我在我的評論中提到,你可以使用相同的對象並使用Json序列化器進行序列化,它會給你該對象的Json表示,使用XML序列化程序將其序列化,並獲得XML等。

因此,對於您的每種格式,您只需要一個自定義序列化程序,可以將該程序序列化爲/從該格式進行反序列化。