2012-11-19 52 views
1

就我的理解而言,大部分序列化/反序列化技術都使用反射來創建對象並設置或獲取值。那麼爲什麼要明確地綁定這些屬性,例如[XmlIgnore] ... for xml,[Serializable] ...在二進制序列化中,[JsonPropery] ... Json.Net等等。由於這些問題就像涉及對象的跨領域問題一樣,我們不能在對象之外做同樣的事情嗎?爲什麼我們需要將序列化屬性修飾爲類和屬性,或者實現一些用於保存數據的接口?

如果問題分離了,用戶可以控制對象圖/樹的哪一部分需要序列化/反序列化哪些上下文以及如何等?

是否有任何這樣的框架,使整個序列化作爲方面,即在類的關注之外?

編輯1:我的需求如下 我的應用程序將數據存儲在一個巨大的樹結構中。客戶的要求是能夠以xml格式序列化某些數據,以及Json中的某些部分數據(我不知道爲什麼會這樣),並且我們將大部分數據以二進制形式序列化爲遺留代碼。

既然在Json中有一些類需要以XML格式顯示一部分數據,另一部分(也可以是xml數據或二進制序列化數據的一部分)。

所以我在尋找一個

  1. 類不應該知道任何序列的特定屬性,而不是串行架構能夠提供足夠的工具來輕鬆做到系列化,而不觸及類的解決方案。
  2. 該框架應該允許持久保存我想要的私人和公共數據。這可以是特定於某個類或實例的,也可以是特定於某個上下文中某個實例的某些屬性的。
    例如
    • SaveTemplate:應該從 樹
    • SaveDocument的每個分支只能保存幾個節點:如果從樹 完全
    • SavePackage保存一個分支:應該保存整個樹。
  3. 應該允許序列化爲不同的格式,如XML,二進制,JSON等出於不同的目的。

所以我打算評估某些序列化框架來實現相同。我發現Json.Net,可以給我下面的

  • 沒有序列標籤被放在公共屬性,就像XML序列化
  • 向後兼容二進制序列化。即我不必更改二進制序列化接口實現
  • 不需要參數較少的構造函數。

但是我仍然需要上面2)和3)中提到的能力。 我還沒有探索過Json。詳細的網絡或任何其他框架。

是否有任何框架可以幫助我實現?

回答

1

隨着您的編輯,指的是私人領域和其他事情:坦率地說,你正在擴展任何一個序列化器將提供的功能集。您可能可以使用擴展API來完成其中的一些工作,但這需要很多工作,而不是100%。如果時間與串行器打交道並進行調試,您將花費很多。

在這種情況下,有一個更好的解決方案:寫一組與您的域實體完全無關的DTO類型。序列化/反序列化DTO - 隨意註釋DTO,就像沒有明天:他們的單一目的是爲了表達序列化意圖。然後只映射到/從DTO和實體類型。

這樣,你就會得到最好的,如果兩個世界。序列化程序對DTO很滿意(並且可以根據需要調整數據,通過調整DTO類型),並且您的域實體乾淨清晰,完全不知道序列化問題。

+0

這似乎是要走的路。我會留下更多的時間來看看其他的迴應,並決定接受答案 – keyr

0

通常你的類/實例會有很多私有字段和其他與XML無關的公共屬性。

像[XMLElement(...)]這樣的屬性也用於定義永不會更改的XML元素的名稱。即使你改變了你的類的屬性名稱,序列化和去序列化仍然有效。

如果你不想使用這些元素,你可以自由地實現自己的XMLWriter或XMLReader。您還可以創建XMLWriter的一個實例,並使用它的Write方法編寫任何您想要的內容。

1

嗯,是的。 XML序列化可以在具有以下兩個注意事項的任何對象上工作,它們都不需要屬性修飾:

  • 該對象必須具有公共參數構造函數。
  • 所有應序列化的信息必須位於公開可見的字段或屬性中。

簡單。但是,沒有屬性的XML序列化會爲該對象生成「默認」XML結構。如果您試圖使通過序列化對象生成的XML類符合預先存在的XML文檔格式(如SOAP請求,HTML或XAML),則此默認結構可能不起作用,因此必須對其進行自定義通過使用任何屬性,告訴內置的序列化器引擎如何調整它生成的內容,或者基本上覆蓋內置引擎的自定義序列化例程,並且完全按照您的要求進行。

最基本的二進制序列化需要將一個單一的屬性Serializable應用於類本身。這僅僅是提示編譯器或運行時,該類的定義應該包含在爲此目的而創建的一組「序列化程序集」中。但是,如果你只是告訴它對象可以被序列化,並且不要告訴它如何,你會得到默認行爲;可能會包含您不需要的字段,或者序列化程序可能會遇到無法序列化的問題。

簡而言之,有幾種內置或免費提供的序列化器,它們只能處理最少量的元數據;但是,如果他們不允許您自定義流程以生成您需要的結果,那麼它們的用處將會非常有限。所以,他們這樣做。

+0

謝謝。我已經按照我的要求編輯了我的問題 – keyr

0

是的。如果您不介意在運行時配置XmlAttributeOverrides實例並將其傳遞給重載的構造函數,則可以使用XmlSerializer執行此操作。通過這種方法,您可以完成您可以使用XML屬性完成的所有工作,但是您可以緩存並重新使用在創建時創建的序列化程序(不要每次都創建一個新實例),因此它是至關重要的

對於二進制文件,protobuf-net允許您在運行時通過RuntimeTypeModel進行配置,例如RuntimeTypeModel.Default.Add(typeof(SomeClass), false).Add("X", "Y", "Z");。但事實是,序列化程序通常很複雜,有很多選項。在大多數情況下,保持實體的配置簡單易行。但是,有些確實允許您在運行時完全配置它們。

相關問題