資料合約序列化程式支援的型別
Windows Communication Foundation (WCF) 使用 DataContractSerializer 做為預設的序列化引擎,以將資料轉換為 XML 並將 XML 轉換回資料。 DataContractSerializer 主要是用來序列化「 資料合約 」(Data Contract) 型別。 但是,它支援其他許多型別,而您可將這些視為擁有隱含資料合約。 下列是可以序列化的完整型別清單:
所有具有不含任何參數之建構函式的公開可見型別。
資料合約型別: 這些是可以套用 DataContractAttribute 屬性的型別。 一般來說,代表商務物件的新自訂型別應該建立為資料合約型別。 如需詳細資訊,請參閱使用資料合約和可序列化型別。
集合型別: 這些是代表資料清單的型別。 這些可以是正常的型別陣列,或集合型別,例如 ArrayList 和 Dictionary<TKey,TValue>。 CollectionDataContractAttribute 屬性可以用來自訂這些型別的序列化 (但非必要)。 如需詳細資訊,請參閱資料合約中的列舉型別。
列舉型別: 列舉 (包括旗標列舉) 都是可序列化的型別。 或者,您也可以使用 DataContractAttribute 屬性來標示列舉型別,這樣一來,參與序列化的每個成員就必須加上 EnumMemberAttribute 屬性標示。 未標示的成員不會序列化。 如需詳細資訊,請參閱資料合約中的列舉型別。
.NET Framework 基本型別: 下列建置在 .NET Framework 中的型別都可以加以序列化並視為基本型別 (Primitive Type): Byte、 SByte、 Int16、 Int32、 Int64、 UInt16、 UInt32、 UInt64、 Single、 Double、 Boolean、 Char、 Decimal、 Object和 String。
其他基本型別: 這些型別並不是 .NET Framework 中的基本型別,但會被視為已序列化之 XML 形式的基本型別。 這些型別是 DateTime、 DateTimeOffset、 TimeSpan、 Guid、 Uri、 XmlQualifiedName和 Byte的陣列。
注意
與其他基本型別不同的是,預設 DateTimeOffset 不是已知型別 ( 如需詳細資訊,請參閱資料合約已知型別。
以 SerializableAttribute 屬性標示的型別。 包含在 .NET Framework 基底類別程式庫中的許多型別都落在此分類中。 DataContractSerializer 充分支援原本由 .NET Framework 遠端處理所使用的序列化程式設計模型,亦即 BinaryFormatter以及 SoapFormatter(包含對 ISerializable 介面的支援)。
代表原始 XML 的型別或代表 ADO.NET 關聯式資料的型別。 支援 XmlElement 型別和 XmlNode 型別的陣列以直接代表 XML。 另外亦支援實作 IXmlSerializable 介面的型別,包括相關的 XmlSchemaProviderAttribute 屬性,以及 XDocument 和 XElement 型別。 ADO.NETDataTable 型別和 DataSet 型別 (及其型別衍生類別) 全部會實作 IXmlSerializable 介面,因此會落在此分類中。 如需詳細資訊,請參閱 資料合約中的 XML 和 ADO.NET 型別。
在部分信任模式中使用特定型別的限制
下列是在部分信任模式案例中使用特定型別的限制清單:
若要在部分信任程式碼中,透過 ISerializable 序列化或還原序列化可實作 DataContractSerializer 的型別需要 SerializationFormatter 和 UnmanagedCode 權限。
在部分信任模式中執行 WCF 程式碼時,不支援
readonly
欄位 (public
和private
) 的序列化與還原序列化。 這是因為產生的 IL 無法加以驗證,因此需要較高的權限。部分信任環境同時支援 DataContractSerializer 和 XmlSerializer 。 然而, DataContractSerializer 的使用需視下列情況而定:
所有可序列化的
[DataContract]
型別必須是公用的。[DataMember]
型別中所有可序列化的[DataContract]
欄位或屬性必須具有公用和讀/寫性質。 在部分信任應用程式中執行 WCF 時,不支援readonly
欄位的序列化與還原序列化。支援
[Serializable]
/ISerializable]
程式設計模型。已知型別必須在程式碼或電腦層級組態 (
Machine.config
) 中指定。 為了安全起見,已知型別無法在應用程式層級的組態中指定。
在部分信任環境中,可實作 IObjectReference 的型別會擲回例外狀況,因為 GetRealObject 方法需要安全性權限
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
。
其他序列化注意事項
下列規則也適用於「資料合約序列化程式」支援的型別:
資料合約序列化程式完全支援泛型型別。
資料合約序列化程式完全支援可為 Null 的型別。
介面型別會被視為 Object 或是集合型別 (在集合介面的案例中)。
同時支援結構與類別。
DataContractSerializer 不支援 XmlSerializer 和 ASP.NET Web 服務所使用的程式設計模型。 特別是,它不支援 XmlElementAttribute 和 XmlAttributeAttribute之類的屬性。 若要啟用對此程式設計模型的支援,WCF 必須切換為使用 XmlSerializer,而非 DataContractSerializer。
DBNull 型別會被特別處理。 它是一種單一型別,且在還原序列化時,還原序列化程式會尊重單一限制並將所有
DBNull
參考指向單一執行個體。 由於DBNull
是一種可序列化型別,它需要 SerializationFormatter 權限。