数据协定序列化程序支持的类型
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、 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 代码时,不支持
readonly
字段(public
和private
)的序列化和反序列化。 这是因为生成的 IL 无法验证,所以需要提升权限。在部分信任环境中支持 DataContractSerializer 和 XmlSerializer 。 但是,使用 DataContractSerializer 时需要遵循以下条件:
所有可序列化的
[DataContract]
类型必须为 Public。[DataMember]
类型中的所有可序列化的[DataContract]
字段或属性必须是公共字段或属性并且可以读取/写入。 在部分受信任的应用程序中运行 WCF 时,不支持readonly
字段的序列化和反序列化。支持
[Serializable]
/ISerializable]
编程模型。必须在代码或计算机级别配置 (
Machine.config
) 中指定已知类型。 出于安全方面的原因,不能在应用程序级配置中指定已知类型。
实现 IObjectReference 的类型会在部分受信任的环境中引发异常,原因是 GetRealObject 方法需要安全权限
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
。
有关序列化的其他说明
下面的规则也适用于数据协定序列化程序支持的类型:
数据协定序列化程序完全支持泛型类型。
数据协定序列化程序完全支持可为空的值类型。
将接口类型视为 Object 或集合类型(对于集合接口)。
支持结构和类。
DataContractSerializer 不支持 XmlSerializer 和 ASP.NET Web 服务使用的编程模型。 具体而言,它不支持类似于 XmlElementAttribute 和 XmlAttributeAttribute的属性。 若要启用对此编程模型的支持,必须将 WCF 切换为使用 XmlSerializer 而非 DataContractSerializer。
以特殊方式处理 DBNull 类型。 此类型是一个单一类型,在反序列化时,反序列化程序遵循单一约束并将所有
DBNull
引用指向单一实例。 因为DBNull
是可序列化的类型,所以它需要 SerializationFormatter 权限。