数据协定序列化程序支持的类型

Windows Communication Foundation(WCF)使用 DataContractSerializer 默认序列化引擎将数据转换为 XML,并将 XML 转换回数据。 DataContractSerializer 是专为序列化数据协定 类型而设计的。 但是,它支持许多其他类型,可以将其视为具有隐式数据协定。 下面是可序列化的类型的完整列表:

在部分信任模式中使用某些类型时的限制

下面是在部分信任模式下使用特定类型的限制列表:

  • 若要在部分受信任的代码中序列化或反序列化实现ISerializable的类型,使用DataContractSerializer需要具有SerializationFormatterUnmanagedCode权限。

  • 部分信任模式下运行 WCF 代码时,不支持readonlypublic字段的private序列化和反序列化。 这是因为生成的 IL 不可验证,因此需要提升的权限。

  • 在部分信任环境中支持 DataContractSerializerXmlSerializer 。 但是,使用DataContractSerializer需符合以下条件:

    • 所有可 [DataContract] 序列化类型都必须是公共的。

    • [DataMember]类型中的所有可序列化[DataContract]字段或属性都必须是公共的并且可读可写。 在部分受信任的应用程序中运行 WCF 时,不支持字段的 readonly 序列化和反序列化。

    • 在部分信任环境中不支持[Serializable]/ISerializable]编程模型。

    • 必须在代码或计算机级配置中指定已知类型(Machine.config)。 出于安全原因,无法在应用程序级别配置中指定已知类型。

  • 实现 IObjectReference 的类型在部分信任的环境中引发异常,因为 GetRealObject 该方法需要安全权限 [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]

有关序列化的其他说明

以下规则也适用于数据协定序列化程序支持的类型:

  • 数据协定序列化程序完全支持泛型类型。

  • 数据协定序列化器完全支持可空值类型。

  • 在集合接口中,接口类型被视为 Object 或作为集合类型。

  • 支持结构和类。

  • DataContractSerializer 不支持 XmlSerializer 和 ASP.NET Web服务所使用的编程模型。 具体而言,它不支持类似 XmlElementAttributeXmlAttributeAttribute. 若要启用对此编程模型的支持,必须将 WCF 切换为使用 XmlSerializer 而不是 DataContractSerializer

  • DBNull 类型以特殊方式处理。 它是单一实例类型,反序列化程序遵循单一实例约束,并将所有 DBNull 引用指向单一实例实例。 由于 DBNull 是可序列化的类型,因此需要 SerializationFormatter 权限。

另请参阅