2011-04-15 29 views

回答

21

由於.NET 3.5 SP1,你不必再這樣做。

如果您沒有任何[DataContract][DataMember]屬性,則DataContractSerializer類的行爲將與舊的XmlSerializer類似:它將序列化類中列出的所有公共讀/寫屬性。

你失去在這個過程中的幾件事情,但:

  • ,因爲你沒有[DataMember]屬性,你不能再定義字段的順序 - 他們會在順序串行化外觀

  • 不能省略的公共屬性(因爲這將要求對所有其他屬性/領域[DataMember]

  • 是你不能定義一個屬性(這將是對[DataMember]屬性再次)

  • 類現在需要有一個公共的,無參數的構造函數(通常不需要數據合同)

all about it in detail亞倫Skonnard在Pluralsight。

+0

+1 - 這是我的新聞,它不應該。 :) – razlebe 2011-04-15 20:13:35

+2

@razlebe:這是微軟對懶惰程序員的投訴進行的投訴:-)(至少這就是Juval Lowy所說的) – 2011-04-15 20:14:45

3

我愛marc的答案,但我想添加一些更多的信息。

DataContractSerializer和DataContractJsonSerializer都支持開箱即用的許多其他序列化模型。這包括IXmlSerializable,Serializable和ISerializable。 POCO支持在.NET 3.5 SP1中添加,但支持這些其他模型一直存在,因爲.NET 3

This blog post詳細說明了支持的範圍,更重要的是,序列化程序對不同模型的優先級(即,它告訴你如果你有一個類型裝飾有多個序列化模型,那麼基於DataContract的序列化器將會執行什麼操作)

因此,如果您閱讀該博客文章,您會注意到POCO支持是優先級列表中的最後一個。如果沒有其他序列化編程模型可用於其父類型,則是串行器的最後手段。例如,如果該類型是某種枚舉類型,則它將根據traditional collection rules進行序列化。如果它是ISerializable或者Serializable,它將根據序列化規則進行序列化。

另一個重要的區別是:在所有其他類型的反序列化過程中,從不調用默認的零參數構造函數。對於POCO類型,它總是被稱爲!這給你一個額外的鉤子,你在其他序列化模型中沒有那麼容易!