数据协定序列化程序支持的类型
Windows Communication Foundation (WCF) 使用 DataContractSerializer 作为其默认的序列化引擎以将数据转换到 XML 并将 XML 转换回数据。DataContractSerializer 是专为序列化数据协定**类型而设计的。但是,它支持许多其他可视为具有隐式数据协定的类型。以下是可以序列化的类型的完整列表:
具有不带参数的构造函数的所有公开可见类型。
数据协定类型。这些是已应用了 DataContractAttribute 属性的类型。表示业务对象的新自定义类型通常应作为数据协定类型创建。有关更多信息,请参见使用数据协定和可序列化类型。
集合类型。这些是表示数据列表的类型。这些类型可以是常规的类型数组或集合类型,例如 ArrayList 和 Dictionary。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、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] 类型必须为 Public。
[DataContract] 类型中的所有可序列化的 [DataMember] 字段或属性必须是公共字段或属性并且可以读取/写入。在部分受信任的应用程序中运行 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 权限。