2012-03-02 48 views
4

每當我試圖序列具有IEnumerable集合我得到一個大的髒錯誤告訴我,因爲它是一個接口,它不能序列化對象。現在我明白爲什麼會發生這種情況,但它爲我提出了一些其他問題。就像如果我打算在具有我的對象中集合,我想它們序列化,我需要訴諸C#Xml序列與IEnumerable的

  1. 使用列表<>,CollectionBase中,ReadOnlyCollectionBase在我的對象。
  2. 使我的對象實現IXmlSerializable接口。
  3. 裝飾我的類與可怕的屬性。
  4. 寫我自己的序列化程序。

什麼是最好的做法的路要走?

回答

6

作爲一個序列化作者,我確切地知道爲什麼它很難robustly只從IEnumerable<T>工作,特別是對於「只能獲得」的屬性。你可能嘗試IList<T>(雖然它不會讓我感到驚訝,如果它想要一個具體類型,如List<T>/T[]),但我懷疑這裏真正的問題是,你試圖用一個模型做兩件事情,並不高興必須妥協才能做到這一點。好的:如果你不想破壞你的域模型,可以寫一個單獨的 DTO模型,用於序列化,並且在它們之間映射。這通常是微不足道的,並且將允許序列化程序和領域模型各擅長於他們的一項工作。當您需要「版本化」系統或引入不同的序列化程序(JSON,protobuf等)時,它也將非常有用。

回覆你的子彈:

  • 我懷疑與Add等任何具體的列表類型(甚至你自己)將工作
  • 我不建議任何人 - 這是痛苦的做可靠
  • 沒有關於屬性的醜陋;再次,我懷疑你的投訴是關於你的歸屬域模型 - 這樣:很好,不用做 - 有一個獨立的模型;你可以實際上在運行時做這一切,但它是更多的工作(見XmlAttributeOverrides,但要注意泄漏的程序集,如果你這樣做)
  • 不要低估了多少工作,基礎知識 - 誘人容易;但不平凡的場景可以是殘酷
+0

你能ellaborate上系列化寫一個單獨的DTO?我從概念上知道DTO是什麼,但它似乎基本上只是複製我的模型,這在我看來是錯誤的,因爲它實際上意味着維護兩個對象模型。 – David 2012-03-05 08:51:21

+0

@David擁有兩個DTO的通用接口,減少重複。否則,如果可能的話,繼續從主要的序列化。 – nawfal 2014-07-10 12:28:07

0

爲了使用接口或derivade類必須使用XmlSerializer(類型類型,類型[] extraTypes)構造。

在extraTypes必須包括可以在你的類實現接口的所有可能的類。