2009-10-28 16 views
3

是否有任何封閉或開放源碼項目爲C#中的XML序列化可以序列化在大多數情況下的任何對象,而無需污染我的域對象與噸屬性?那也將處理使用內部泛型類構建的集合的序列化?一個好處是它可以處理序列化接口類型的屬性。另一個好處是,它可以(註明內部get訪問或至少)C#高級XML序列化,不需要域對象的污染

+0

如果您沒有找到XML,請查看JSON.NET。 http://www.codeplex.com/Json – Klinger 2009-10-28 22:29:57

+0

我曾經想過,因爲我知道有很多JSON序列化程序存在,可能可以做我想做的事情,但是我需要xml來執行XSLT編譯轉換(文檔生成),並且我不會想想要轉換JSON是一種可行的方式 – 2009-10-28 23:07:21

+0

默認的XMLSerializer是一個不錯的選擇。它只需要屬性來改變它的默認行爲。在我工作的公司中,我們序列化了大量複雜的對象,但沒有放置單個屬性,因爲我們對輸出沒有興趣。實際上,任何其他序列化程序也會要求你放置屬性來改變行爲。 – 2009-10-28 23:49:05

回答

5

那麼序列化具有隻讀屬性的對象,首先定義「高級」,即什麼專門你需要一個XmlSerializer不有。在POCO方面,XmlSerializer一個重載的構造函數,它接受所有你能曾經要添加,以避免將它們添加到您的對象模型的屬性 - 但它仍然需要一個公共的無參數的構造函數,並且僅適用於公共讀/寫字段/屬性。如果你使用這種方法,你應該緩存/重新使用序列化程序。

我不知道有任何類似的替代品,只是因爲在大多數情況下,這是「足夠好」 - 而這往往是一個錯誤的嘗試暴力破解現有的域對象到DTO。這可能是更簡單,更易於維護簡單域實體映射到一個新的DTO(s)表示歸因(並有適當的構造函數/屬性/等)。

注意,對於構造函數/屬性發出DataContractSerializer一些答案,但這並沒有對什麼XML是什麼樣子儘可能多的細粒度控制。

+0

我認爲污染物體的路線可能是最好的答案,因爲我已經瞭解到AutoMapper應該能夠用零代碼完成大部分翻譯。 – 2009-11-12 21:06:19

0
  • 您可以通過使用InternalsVisibleToAttribute來允許System.Xml.dll訪問您的內部。 從而序列化內部類型和/或內部成員。包括內部的.ctors。
  • 您也可以實現IXmlSerializable的類上定製自己的序列化(如含容器接口引用)。
  • 你不必提供有關你的類XML序列化的屬性,而是將它們作爲XmlAttributeOverrides代替。

XmlSerializer幾乎總是人們想要的,他們只是不知道它是如此靈活。