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)]
。
有关序列化的其他说明
以下规则也适用于数据协定序列化程序支持的类型:
数据协定序列化程序完全支持泛型类型。
数据协定序列化器完全支持可空值类型。
在集合接口中,接口类型被视为 Object 或作为集合类型。
支持结构和类。
DataContractSerializer 不支持 XmlSerializer 和 ASP.NET Web服务所使用的编程模型。 具体而言,它不支持类似 XmlElementAttribute 和 XmlAttributeAttribute. 若要启用对此编程模型的支持,必须将 WCF 切换为使用 XmlSerializer 而不是 DataContractSerializer。
该 DBNull 类型以特殊方式处理。 它是单一实例类型,反序列化程序遵循单一实例约束,并将所有
DBNull
引用指向单一实例实例。 由于DBNull
是可序列化的类型,因此需要 SerializationFormatter 权限。