导出 (0) 打印
全部展开

Azure Web 应用程序和序列化

更新时间: 2014年5月

注:本页面内容可能不完全适用中国大陆地区运营的 Windows Azure服务。如要了解不同地区 Windows Azure 服务的差异, 请参考本网站.

与编写本地应用程序相比,为 Microsoft Azure 编写应用程序时,数据序列化变得日益重要。用户使用 Azure 应用程序时需要支付数据库使用、常规存储、数据传输和缓存方面的费用。有关定价的详细信息,请参阅 Azure 定价概述。此外,Azure 应用程序还可以通过移动设备(如手机和平板电脑等)使用。不过,由于这些设备具有部分连接的特点,在这些设备上使用 Azure 应用程序时可能会出现延迟。基于所有这些因素,考虑你的应用程序采取何种方式来发送和接收数据非常重要。较小的负载将有助于你降低带宽和存储成本,并可能有助于最大限度地减少延迟。

WCF 中的序列化

WCF 配有 4 种不同的序列化程序:DataContractSerializerXmlSerializerNetDataContractSerializerDataContractJsonSerializer。序列化程序决定了 .NET 对象转换为 XML 的方式。XML 数据在序列化后即作为一串字节连网写入。取用 XML 并将其转换成字节流的过程称为编码。WCF 支持以下编码格式:文本、二进制和 MTOM。序列化受服务合同属性的约束。默认情况下使用 DataContractSerializer(由 ServiceContractAttribute 指定)。若要使用 XmlSerializer,请将 XmlSerializerFormatAttribute 应用于服务合同。如果将 WebGetAttributeWebInvokeAttribute 应用于服务操作,则会使用 DataContractJsonSerializer。以上两种属性均支持你指定 RequestFormatResponseFormat。若要使用 JSON 作为请求和响应的格式,请将请求格式和响应格式都设置为 WebMessageFormat.Json。要使用 JSON,你必须使用能够自动配置 WebHttpBehaviorWebHttpBinding。有关 WCF 序列化的详细信息,请参阅:序列化与反序列化Windows Communication Foundation 中的序列化。有关 JSON 和 WCF 的详细信息,请参阅支持 REST 的服务和 WCF 简介在 .NET 3.5 中创建支持 JSON 的 WCF 服务WCF 中的 REST 概述

Important重要提示
要使用 JSON,需要使用不支持 SOAP 通信的 WebHttpBindingWebHttpBehavior。与 WebHttpBinding 通信的服务不支持公开服务元数据,因此,你将无法使用 Visual Studio 的“添加服务引用”功能或 svcutil 命令行工具来生成客户端代理。有关如何以编程方式调用使用 WebHttpBinding 的服务的详细信息,请参阅如何通过 WCF 使用 REST 服务

序列化和 OData 服务

目前,开放式数据协议 (OData) 支持以下两种序列化格式:

  • Atom 联合格式 (Atom):一种用于 Web 源的基于 XML 的交换格式。

  • JavaScript 对象表示法 (JSON):一种可人工阅读的轻量级数据交换格式。

在 OData 中,客户端可通过设置 Accept 消息标头请求所需的序列化响应格式。对于无法设置请求标头的客户端,OData 还为其提供 $format 系统查询选项。WCF Data Services 支持 Atom 和 JSON 两种序列化格式,但是不支持 $format 查询选项。要为所有可能的客户端提供 JSON 序列化支持,应在 WCF Data Services 实现中启用对 $format 查询选项的支持。有关详细信息,请参阅 Azure 中的 OData 指南。

序列化大小

通常情况下,通过了解不同序列化方式在序列化相同类型时的差异,可以看出序列化大小的重要区别。以下是示例 Person 类型的定义:

[DataContract(Namespace="http://example.org/person")]
    public class Person
    {
        public Person() { }
        public Person(string last, string first, string email)
        {
            lastName = last;
            firstName = first;
            emailAddress = email;
        }

        [DataMember]
        public string firstName { get; set; }

        [DataMember]
        public string lastName { get; set; }

        [DataMember]
        public string emailAddress { get; set; }
    }
}           

DataContractSerializer

DataContractSerializer 序列化 Person 实例的过程如下所示:

<?xml version="1.0"?>
    <Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.org/person">
    <emailAddress>kim.abercrombie@contoso</emailAddress>
    <firstName>Kim</firstName>
    <lastName>Abercrombie</lastName>
</Person>

XmlSerializer

XmlSerializer 序列化 Person 实例的过程如下所示:

<?xml version="1.0"?>
<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <firstName>Kim</firstName>
    <lastName>Abercrombie</lastName>
    <emailAddress>kim.abercrombie@contoso</emailAddress>
</Person>

DataContractJsonSerializer

DataContractJsonSerializer 序列化 Person 实例的过程如下所示:

{"emailAddress":"kim.abercrombie@contoso","firstName":"Kim","lastName":"Abercrombie"}

编码器

另一个需要考虑的领域是消息编码器。编码器取用 XML 并将其转换为一串可连网发送的字节。这样可显著减小负载。编码器在绑定时进行配置。有关编码器的详细信息,请参阅选择消息编码器。Microsoft 二进制编码器提供的数据表示最小,不过,该编码器只能用在客户端和服务均在 .NET Framework 下运行的应用场景中。如果你的应用程序需要与其他平台互操作,请使用文本编码器。此外,你也可以实现自定义编码器并进行某种压缩。有关详细信息,请参阅自定义消息编码器

建议

序列化程序和编码器的最佳选择取决于你的应用程序及其互操作性需求。对于服务和客户端均在 .NET Framework 下运行的应用场景,请考虑使用二进制编码器和 DataContractSerializer。对于需要互操作性的应用场景,请使用文本编码器。在上述应用场景中,DataContractJsonSerializer 提供的数据表示最小,但需要使用非 SOAP 服务。如果你需要使用 SOAP,请考虑使用 DataContractSerializer

社区附加资源

添加
显示:
© 2014 Microsoft