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 串行化簡介
如何:串行化物件
如何:反序列化物件