資料合約序列化程式支援的型別
Windows Communication Foundation (WCF) 會使用做為其預設的 DataContractSerializer 序列化引擎,將資料轉換成 xml,並將 XML 轉換回資料。 DataContractSerializer 主要是用來序列化「 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.NET DataTable 型別和 DataSet 型別 (,以及其具型別的衍生類別) 全部都能執行 IXmlSerializable 介面,因此符合這個類別。 如需詳細資訊,請參閱資料合約中的 XML 和 ADO.NET 類型。
在部分信任模式中使用特定型別的限制
下列是在部分信任模式案例中使用特定型別的限制清單:
若要在部分信任程式碼中,透過 ISerializable 序列化或還原序列化可實作 DataContractSerializer 的型別需要 SerializationFormatter 和 UnmanagedCode 權限。
在 部分信任 模式中執行 WCF 程式碼時,不支援欄位的序列化和 還原序列化 (
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不支援和 ASP.NET Web 服務所使用的程式 XmlSerializer 設計模型。 特別是,它不支援 XmlElementAttribute 和 XmlAttributeAttribute之類的屬性。 若要啟用此程式設計模型的支援,必須將 WCF 切換為使用 XmlSerializer 而不是 DataContractSerializer 。
DBNull 型別會被特別處理。 它是一種單一型別,且在還原序列化時,還原序列化程式會尊重單一限制並將所有
DBNull
參考指向單一執行個體。 由於DBNull
是一種可序列化型別,它需要 SerializationFormatter 權限。