Windows Communication Foundation (WCF) 會使用 DataContractSerializer 作為其預設串行化引擎,將數據轉換成 XML,並將 XML 轉換回數據。 DataContractSerializer是設計來串行化數據合約型別。 不過,它支援許多其他類型,可視為具有隱含數據合約。 以下是可串行化之型別的完整清單:
具有沒有參數之建構函式的所有公開可見型別。
數據合約類型。 這些是已套用屬性的DataContractAttribute的類型。 代表商務物件的新自定義類型通常應該建立為數據合約類型。 如需詳細資訊,請參閱 使用數據合約 和 可串行化類型。
集合類型。 這些是代表數據清單的類型。 這些可以是型別的一般陣列,或集合型別,例如 ArrayList 和 Dictionary<TKey,TValue>。 CollectionDataContractAttribute屬性可以用於自定義這些類型的串行化過程,但並非必要。 如需詳細資訊,請參閱 數據合約中的集合類型。
列舉型別。 列舉,包括旗標列舉,都是可串行化的。 選擇性地,列舉型別可以使用 DataContractAttribute 屬性來標記,在此情況下,參與串行化的每個成員都必須標記為 EnumMemberAttribute 屬性。 未標示的成員不會被序列化。 如需詳細資訊,請參閱 數據合約中的列舉型別。
.NET Framework 基本類型。 .NET Framework 內建的下列類型都可以串行化,而且視為基本型別:Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Boolean、Char、Decimal、Object和String。
其他基本類型。 這些類型不是 .NET Framework 中的基本類型,而是被視為串行化 XML 窗體中的基本類型。 這些類型為DateTime、DateTimeOffset、TimeSpan、、GuidUri、、 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不支援和 ASP.NET Web 服務所使用的XmlSerializer程式設計模型。 特別是,它不支援如XmlElementAttribute和XmlAttributeAttribute等屬性。 若要開啟此程式設計模型的支援,WCF 必須切換為使用 XmlSerializer ,而不是 DataContractSerializer。
此 DBNull 類型會以特殊方式處理。 它是單例類型,在反序列化時,反序列化器會遵循單例約束,並將所有
DBNull參照指向單例實例。 因為DBNull是可串行化的型別,所以需要 SerializationFormatter 許可權。