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

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

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

以下是在部分信任模式方案中使用某些类型时的限制列表:

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

  • 部分信任模式下运行 WCF 代码时,不支持 readonly 字段(publicprivate)的序列化和反序列化。 这是因为生成的 IL 无法验证,所以需要提升权限。

  • 在部分信任环境中支持 DataContractSerializerXmlSerializer 。 但是,使用 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 服务使用的编程模型。 具体而言,它不支持类似于 XmlElementAttributeXmlAttributeAttribute的属性。 若要启用对此编程模型的支持,必须将 WCF 切换为使用 XmlSerializer 而非 DataContractSerializer

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

另请参阅