資料合約序列化程式支援的型別
Windows Communication Foundation (WCF) 使用 DataContractSerializer 做為預設的序列化引擎,以將資料轉換為 XML 並將 XML 轉換回資料。DataContractSerializer 主要是用來序列化「資料合約」(Data Contract) 型別。但是,它支援其他許多型別,而您可將這些視為擁有隱含資料合約。下列是可以序列化的完整型別清單:
所有具有不含任何參數之建構函式的公開可見型別。
資料合約型別:這些是可以套用 DataContractAttribute 屬性的型別。一般來說,代表商務物件的新自訂型別應該建立為資料合約型別。如需詳細資訊,請參閱使用資料合約和可序列化的型別。
集合型別:這些是代表資料清單的型別。這些可以是正常的型別陣列,或集合型別,例如 ArrayList 和 Dictionary。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.NET DataTable 型別和 DataSet 型別 (及其型別衍生類別) 全部會實作 IXmlSerializable 介面,因此會落在此分類範圍內。如需詳細資訊,請參閱 資料合約中的 XML 與 ADO.NET 型別.
在部分信任模式中使用特定型別的限制
下列是在部分信任模式案例中使用特定型別的限制清單:
若要在部分信任程式碼中,透過 DataContractSerializer 序列化或還原序列化可實作 ISerializable 的型別需要 SerializationFormatter 和 UnmanagedCode 權限。
在部分信任模式中執行 WCF 程式碼時,將不支援 readonly 欄位的序列化與還原序列化 (public 和 private 兩者)。這是因為產生的 IL 無法加以驗證,因此需要較高的權限。
部分信任環境同時支援 DataContractSerializer 和 XmlSerializer。然而,DataContractSerializer 的使用需視下列情況而定:
所有可序列化的 [DataContract] 型別必須是公用的。
[DataContract] 型別中所有可序列化的 [DataMember] 欄位或屬性必須具有公用和讀/寫性質。在部分信任應用程式中執行 WCF 時,不支援 readonly 欄位的序列化與還原序列化。
部分信任環境不支援 [Serializable]/ISerializable] 程式設計模型。
已知型別必須在程式碼或電腦層級組態 (Machine.config) 中指定。為了安全起見,已知型別無法在應用程式層級的組態中指定。
在部分信任環境中,可實作 IObjectReference 的型別會擲回例外狀況,因為 GetRealObject 方法需要安全性權限 [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]。
其他序列化注意事項
下列規則也適用於「資料合約序列化程式」支援的型別:
資料合約序列化程式完全支援泛型型別。
資料合約序列化程式完全支援可為 Null 的型別 (Nullable Type)。
介面型別會被視為 Object 或是集合型別 (在集合介面的案例中)。
同時支援結構與類別。
DataContractSerializer 不支援 XmlSerializer 和 ASP.NET Web 服務所使用的程式設計模型。特別是,它不支援 XmlElementAttribute 和 XmlAttributeAttribute 之類的屬性。若要啟用對此程式設計模型的支援,WCF 必須切換為使用 XmlSerializer,而不是 DataContractSerializer。
DBNull 型別會被特別處理。它是一種單一型別,且在還原序列化時,還原序列化程式會尊重單一限制並將所有 DBNull 參考指向單一執行個體。由於 DBNull 是一種可序列化型別,它需要 SerializationFormatter 權限。
另請參閱
概念
資料合約中的 XML 與 ADO.NET 型別
使用資料合約
可序列化的型別
資料合約中的集合型別
資料合約中的列舉型別