可序列化的型別
根據預設,DataContractSerializer 會序列化所有公開可見的型別。型別的所有公用讀取/寫入屬性 (Property) 和欄位都會序列化。
您可以透過將 DataContractAttribute 和 DataMemberAttribute 屬性套用至型別和成員的方式來變更預設行為。當您擁有的型別並非您所能控制,而且無法經過修改以加入屬性時,這個功能便相當實用。DataContractSerializer 會識別這類「未標記」的型別。
序列化預設值
您可以套用 DataContractAttribute 和 DataMemberAttribute 屬性,以便明確控制或自訂型別和成員的序列化作業。此外,您可以將這些屬性套用至私用欄位。不過,即使未以這些屬性標記的型別,仍可以進行序列化和還原序列化。以下為適用的規則和例外狀況:
- DataContractSerializer 會使用新建立型別的預設屬性 (Property),從未包含屬性 (Attribute) 的型別推斷資料合約。
- 除非您將 IgnoreDataMemberAttribute 屬性 (Attribute) 套用至該成員,否則所有公用欄位,以及含有公用
get
和set
方法的屬性 (Property) 都會加以序列化。 - 序列化語意 (Semantics) 與 XmlSerializer 的語意相似。
- 在未標記的型別中,只有具有未包含參數之建構函式 (Constructor) 的公用型別才會序列化。這個規則的例外情形是搭配 IExtensibleDataObject 介面使用的 ExtensionDataObject。
- 唯讀欄位、沒有
get
或set
方法的屬性,以及具有內部或私用set
或get
方法的屬性不會序列化。這類屬性會被略過,而且不會擲回例外狀況,但不包括 get-only 集合。 - XmlSerializer 屬性 (例如 XmlElement、XmlAttribute、XmlIgnore、XmlInclude 等屬性) 會被略過。
- 如果您未將 DataContractAttribute 屬性套用至指定的型別,則序列化程式會忽略該型別中任何已套用 DataMemberAttribute 屬性的成員。
- 未標記 DataContractAttribute 屬性 (Attribute) 的型別支援 KnownTypes 屬性 (Property)。這包括支援未標記型別上的 KnownTypeAttribute 屬性。
- 若要「選擇不」序列化公用成員、屬性 (Property) 或欄位的處理序,請將 IgnoreDataMemberAttribute 屬性 (Attribute) 套用至該成員。
繼承
未標記的型別 (沒有 DataContractAttribute 屬性的型別) 可以繼承自沒有這個屬性的型別,不過不允許反向操作,也就是說,擁有這個屬性的型別無法繼承自未標記的型別。強制執行這個規則的主要原因,是為了確保與使用舊版 .NET Framework 撰寫的程式碼回溯相容。
請參閱
參考
IgnoreDataMemberAttribute
DataContractAttribute
DataMemberAttribute
XmlSerializer