匯出 (0) 列印
全部展開

Azure Web 應用程式和序列化

更新日期: 2014年6月

相較於撰寫內部部署應用程式,為 Azure 撰寫應用程式時,資料序列化愈形重要。Azure 應用程式必須支付資料庫使用、一般儲存空間、資料傳輸和快取的費用。如需有關定價的詳細資訊,請參閱 Azure 定價概觀。此外,也可以從類似手機和平板電腦等行動裝置使用 Azure 應用程式,而且由於其部分連接的性質,這樣可能會導致延遲。所有的這些因素都表示,思考應用程式如何傳送和接收資料是一件非常重要的事。較小的裝載將會降低頻寬和儲存的成本,而且可能有助於將延遲降至最低。

WCF 隨附 4 種不同的序列化程式:DataContractSerializerXmlSerializerNetDataContractSerializerDataContractJsonSerializer。序列化程式會判斷 .NET 物件如何轉換成 XML。一旦序列化之後,XML 資料就會當做一系列的位元組寫入線路。取得 XML 並將其轉換成位元組資料流的程序稱為編碼。WCF 支援下列編碼方式:文字、二進位和 MTOM。序列化是由服務合約的屬性所控制。預設會使用 DataContractSerializer,這是由 ServiceContractAttribute 所指定。若要使用 XmlSerializer,請將 XmlSerializerFormatAttribute 套用至服務合約。當 WebGetAttributeWebInvokeAttribute 套用至服務作業時,將會使用 DataContractJsonSerializer。這兩個屬性可讓您指定 RequestFormatResponseFormat。若要針對要求和回應使用 JSON,請將這兩個屬性都設定為 WebMessageFormat.Json。若要使用 JSON,您必須使用 WebHttpBinding,它會自動設定 WebHttpBehavior。如需 WCF 序列化的詳細資訊,請參閱:<序列化和還原序列化>和<Windows Communication Foundation 序列化>。如需有關 JSON 和 WCF 的詳細資訊,請參閱 RESTfull 服務 (配備 WCF) 介紹在 .NET 3.5 中建立具有 JSON 功能的 WCF 服務WCF 中的 REST 概觀

Important重要事項
使用 JSON 必須使用 WebHttpBindingWebHttpBehavior,這兩者不支援 SOAP 通訊。與 WebHttpBinding 通訊的服務不支援公開服務中繼資料,所以您將無法使用 Visual Studio 的 [加入服務參考] 功能或 svcutil 命令列工具來產生用戶端 Proxy。如需有關如何以程式設計方式呼叫使用 WebHttpBinding 之服務的詳細資訊,請參閱如何使用 WCF 來取用 REST 服務

開放式資料通訊協定目前支援下列兩種序列化格式:

  • Atom 同步發佈格式 (Atom):用於 Web 摘要的 XML 架構交換格式。

  • JavaScript 物件標記法 (JSON):一般人可判讀的輕量型資料交換格式。

在 OData 中,用戶端可以藉由設定接受訊息標頭來要求所需的回應序列化格式。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; }
    }
}           

Person 的執行個體中序列化的 DataContractSerializer,如下所示:

<?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>

Person 的執行個體中序列化的 XmlSerializer,如下所示:

<?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>

Person 的執行個體中序列化的 DataContractJsonSerializer,如下所示:

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

另一個要考量的地方為訊息編碼器。編碼器會接受 XML,並將其轉換成一系列的位元組,以便可以跨線路傳送。如此一來,便可大幅降低裝載的大小。編碼器會在繫結上設定。如需有關編碼器的詳細資訊,請參閱選擇訊息編碼器。Microsoft 二進位編碼器將會提供資料的最小表示方式,但是只能在用戶端和服務都在 .NET Framework 之下執行的情況中使用。如果您的應用程式需要與其他平台之間的互通性,請使用文字編碼器。您也可以實作自己的自訂編碼器,並執行某種形式的壓縮。如需詳細資訊,請參閱自訂訊息編碼器:壓縮編碼器

要使用的最佳序列化程式和編碼器將取決於您的應用程式和其互通性的需求。如果是服務和用戶端都在 .NET Framework 之下執行的情況,請考慮使用二進位編碼器和 DataContractSerializer。如果是需要互通性的情況,請使用文字編碼器。在這些類型的情況下,DataContractJsonSerializer 將會提供最小的表示方式,但是這樣需要使用非 SOAP 服務。如果您需要使用 SOAP,請考慮使用 DataContractSerializer

顯示:
© 2014 Microsoft