XML 序列化是由
    
     XmlSerializer
    
    類別在 XML Web 服務架構中使用的基礎傳輸機制。 若要控制 XML Web 服務所產生的 XML,您可以將控制
    
     XML 序列化
    
    的屬性和
    
     控制編碼 SOAP 序列化
    
    的屬性同時套用至用來建立 XML Web 服務(.asmx)檔案的類別、傳回值、參數和欄位。 如需建立 XML Web 服務的詳細資訊,請參閱
    
     使用 ASP.NET 的 XML Web 服務
    
    。
   
   
    字面和編碼樣式
   
   
    XML Web 服務所產生的 XML 可以使用常值或編碼的兩種方式之一來格式化,如
    
     自定義 SOAP 訊息格式
    
    中所述。 因此,有兩組屬性可控制 XML 串行化。
    
     控制 XML 串行化的屬性
    
    中列出的屬性旨在控制字面樣式 XML。
    
     控制編碼 SOAP 串行化屬性
    
    中列出的屬性會控制編碼的樣式。 藉由選擇性地套用這些屬性,您可以量身打造應用程式,使其傳回一種或兩種樣式。 此外,這些屬性可以根據需要套用於傳回值和參數。
   
   
    使用這兩種樣式的範例
   
   
    當您建立 XML Web 服務時,可以在 方法上使用這兩組屬性。 在下列程式代碼範例中,名為
    
     MyService
    
    的 類別包含兩個 XML Web 服務方法,
    
     MyLiteralMethod
    
    以及
    
     MyEncodedMethod
    
    。 這兩種方法都會執行相同的函式:傳回 類別的
    
     Order
    
    實例。 在
    
     Order
    
    類別中,
    
     XmlTypeAttribute
    
    和
    
     SoapTypeAttribute
    
    屬性都被應用到
    
     OrderID
    
    欄位上,並且兩個屬性的
    
     ElementName
    
    屬性被設定為不同的值。
   
   
    若要執行此範例,請將程式代碼貼入擴展名為 .asmx 的檔案,並將檔案放入 Internet Information Services (IIS) 所管理的虛擬目錄中。 從網頁瀏覽器輸入計算機、虛擬目錄和檔案的名稱。
   
   <%@ WebService Language="VB" Class="MyService" %>  
Imports System  
Imports System.Web.Services  
Imports System.Web.Services.Protocols  
Imports System.Xml.Serialization  
Public Class Order  
    ' Both types of attributes can be applied. Depending on which type  
    ' the method used, either one will affect the call.  
    <SoapElement(ElementName:= "EncodedOrderID"), _  
    XmlElement(ElementName:= "LiteralOrderID")> _  
    public OrderID As String  
End Class  
Public Class MyService  
    <WebMethod, SoapDocumentMethod> _  
    public Function MyLiteralMethod() As Order
        Dim myOrder As Order = New Order()  
        return myOrder  
    End Function  
    <WebMethod, SoapRpcMethod> _  
    public Function MyEncodedMethod() As Order
        Dim myOrder As Order = New Order()  
        return myOrder  
    End Function  
End Class  
<%@ WebService Language="C#" Class="MyService" %>  
using System;  
using System.Web.Services;  
using System.Web.Services.Protocols;  
using System.Xml.Serialization;  
public class Order {  
    // Both types of attributes can be applied. Depending on which type  
    // the method used, either one will affect the call.  
    [SoapElement(ElementName = "EncodedOrderID")]  
    [XmlElement(ElementName = "LiteralOrderID")]  
    public String OrderID;  
public class MyService {  
    [WebMethod][SoapDocumentMethod]  
    public Order MyLiteralMethod(){  
        Order myOrder = new Order();  
        return myOrder;  
    [WebMethod][SoapRpcMethod]  
    public Order MyEncodedMethod(){  
        Order myOrder = new Order();  
        return myOrder;  
下列程式代碼範例會呼叫 MyLiteralMethod。 專案名稱會變更為 「LiteralOrderID」。
<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body>  
        <MyLiteralMethodResponse xmlns="http://tempuri.org/">  
            <MyLiteralMethodResult>  
                <LiteralOrderID>string</LiteralOrderID>  
            </MyLiteralMethodResult>  
        </MyLiteralMethodResponse>  
    </soap:Body>  
</soap:Envelope>  
下列程式代碼範例會呼叫 MyEncodedMethod。 元素名稱為 「EncodedOrderID」。
<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">  
        <tns:MyEncodedMethodResponse>  
            <MyEncodedMethodResult href="#id1" />  
        </tns:MyEncodedMethodResponse>  
        <types:Order id="id1" xsi:type="types:Order">  
            <EncodedOrderID xsi:type="xsd:string">string</EncodedOrderID>  
        </types:Order>  
    </soap:Body>  
</soap:Envelope>  
將屬性套用至傳回值
您也可以套用屬性以傳回值來控制命名空間、項目名稱等等。 下列程式代碼範例會將 XmlElementAttribute 屬性套用至 方法的 MyLiteralMethod 傳回值。 這樣做可讓您控制命名空間和項目名稱。
<WebMethod, SoapDocumentMethod> _  
public Function MyLiteralMethod() As _  
<XmlElement(Namespace:="http://www.cohowinery.com", _  
ElementName:= "BookOrder")> _  
Order
    Dim myOrder As Order = New Order()  
    return myOrder  
End Function  
[return: XmlElement(Namespace = "http://www.cohowinery.com",  
ElementName = "BookOrder")]  
[WebMethod][SoapDocumentMethod]  
public Order MyLiteralMethod(){  
    Order myOrder = new Order();  
    return myOrder;  
叫用時,程式代碼會傳回類似下列的 XML。
<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body>  
        <MyLiteralMethodResponse xmlns="http://tempuri.org/">  
            <BookOrder xmlns="http://www.cohowinery.com">  
                <LiteralOrderID>string</LiteralOrderID>  
            </BookOrder>  
        </MyLiteralMethodResponse>  
    </soap:Body>  
</soap:Envelope>  
套用至參數的屬性
您也可以將屬性套用至參數,以指定命名空間、項目名稱等等。 下列程式代碼範例會將 參數新增至 MyLiteralMethodResponse 方法,並將 屬性套用 XmlAttributeAttribute 至 參數。 元素名稱和命名空間都是針對 參數所設定。
<WebMethod, SoapDocumentMethod> _  
public Function MyLiteralMethod(<XmlElement _  
("MyOrderID", Namespace:="http://www.microsoft.com")>ID As String) As _  
<XmlElement(Namespace:="http://www.cohowinery.com", _  
ElementName:= "BookOrder")> _  
Order
    Dim myOrder As Order = New Order()  
    myOrder.OrderID = ID  
    return myOrder  
End Function  
[return: XmlElement(Namespace = "http://www.cohowinery.com",  
ElementName = "BookOrder")]  
[WebMethod][SoapDocumentMethod]  
public Order MyLiteralMethod([XmlElement("MyOrderID",
Namespace="http://www.microsoft.com")] string ID){  
    Order myOrder = new Order();  
    myOrder.OrderID = ID;  
    return myOrder;  
SOAP 要求將會是如下所示。
<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body>  
        <MyLiteralMethod xmlns="http://tempuri.org/">  
            <MyOrderID xmlns="http://www.microsoft.com">string</MyOrderID>  
        </MyLiteralMethod>  
    </soap:Body>  
</soap:Envelope>  
將屬性套用至類別
如果您需要控制與類別相互關聯的項目命名空間,您可以視需要套用 XmlTypeAttribute、 XmlRootAttribute和 SoapTypeAttribute。 下列程式代碼範例會將這三個都套用至 Order 類別。
<XmlType("BigBookService"), _  
SoapType("SoapBookService"), _  
XmlRoot("BookOrderForm")> _  
Public Class Order  
    ' Both types of attributes can be applied. Depending on which  
    ' the method used, either one will affect the call.  
    <SoapElement(ElementName:= "EncodedOrderID"), _  
    XmlElement(ElementName:= "LiteralOrderID")> _  
    public OrderID As String  
End Class  
[XmlType("BigBooksService", Namespace = "http://www.cpandl.com")]  
[SoapType("SoapBookService")]  
[XmlRoot("BookOrderForm")]  
public class Order {  
    // Both types of attributes can be applied. Depending on which  
    // the method used, either one will affect the call.  
    [SoapElement(ElementName = "EncodedOrderID")]  
    [XmlElement(ElementName = "LiteralOrderID")]  
    public String OrderID;  
當您檢查服務描述時,可以看見套用 XmlTypeAttribute 和 SoapTypeAttribute 的結果,如下列程式代碼範例所示。
<s:element name="BookOrderForm" type="s0:BigBookService" />
<s:complexType name="BigBookService">
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="LiteralOrderID" type="s:string" />
  </s:sequence>
  <s:schema targetNamespace="http://tempuri.org/encodedTypes">
    <s:complexType name="SoapBookService">
      <s:sequence>
        <s:element minOccurs="1" maxOccurs="1" name="EncodedOrderID" type="s:string" />
      </s:sequence>
    </s:complexType>
  </s:schema>
</s:complexType>
可以在 HTTP GET 和 HTTP POST 的結果中看到 XmlRootAttribute 的效果,如下所示。
<?xml version="1.0" encoding="utf-8"?>  
<BookOrderForm xmlns="http://tempuri.org/">  
    <LiteralOrderID>string</LiteralOrderID>  
</BookOrderForm>  
              XML 和 SOAP 串行化
              控制編碼 SOAP 串行化的屬性
              如何:將物件串行化為 SOAP-Encoded XML 數據流
              如何覆寫編碼的SOAP XML序列化
              XML 串行化簡介
              如何:串行化物件
              如何:反序列化物件