可序列化的型別
根據預設,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