XML Web Services의 XML SerializationXML Serialization with XML Web Services

XML serialization은 XML Web services 아키텍처에 사용되며 XmlSerializer 클래스에 의해 수행되는 내부 전송 메커니즘입니다.XML serialization is the underlying transport mechanism used in the XML Web services architecture, performed by the XmlSerializer class. XML Web services로 생성된 XML을 제어하려면 XML serialization을 제어하는 특성인코드된 SOAP serialization을 제어하는 특성에 나열된 특성을 XML Web services(.asmx)를 만드는 데 사용된 파일의 클래스, 반환 값, 매개 변수 및 필드에 적용할 수 있습니다.To control the XML generated by an XML Web service, you can apply the attributes listed in both Attributes That Control XML Serialization and Attributes That Control Encoded SOAP Serialization to the classes, return values, parameters, and fields of a file used to create an XML Web service (.asmx). XML Web Services를 만드는 방법에 대 한 자세한 내용은 ASP.NET를 사용 하는 Xml 웹 서비스를 참조 하세요.For more information about creating an XML Web service, see XML Web Services Using ASP.NET.

리터럴 및 인코딩된 스타일Literal and Encoded Styles

XML Web services에 의해 생성 된 XML은 SOAP 메시지 형식 사용자 지정에 설명 된 대로 리터럴 또는 인코딩된 두 가지 방법 중 하나로 형식이 지정 될 수 있습니다.The XML generated by an XML Web service can be formatted in either one of two ways, either literal or encoded, as explained in Customizing SOAP Message Formatting. 따라서 XML serialization을 제어하는 두 개의 특성 집합이 있습니다.Therefore there are two sets of attributes that control XML serialization. XML serialization을 제어하는 특성에 나열된 특성은 리터럴 스타일 XML을 제어하도록 설계되었습니다.The attributes listed in Attributes That Control XML Serialization are designed to control literal style XML. 인코드된 SOAP serialization을 제어하는 특성에 나열된 특성은 인코드된 스타일을 제어합니다.The attributes listed in Attributes That Control Encoded SOAP Serialization control the encoded style. 이러한 특성을 선택적으로 적용하여 애플리케이션이 두 스타일 중 하나 또는 둘 모두를 반환하도록 조정할 수 있습니다.By selectively applying these attributes, you can tailor an application to return either, or both styles. 또한 이러한 특성을 필요에 따라 반환 값 및 매개 변수에 적용할 수 있습니다.Furthermore, these attributes can be applied (as appropriate) to return values and parameters.

두 스타일 사용 예제Example of Using Both Styles

XML Web service를 만들 때는 메서드에 두 특성 집합 모두를 사용할 수 있습니다.When you're creating an XML Web service, you can use both sets of attributes on the methods. 다음 코드 예제에서는 MyService라는 클래스에 두 개의 XML Web services 메서드인 MyLiteralMethodMyEncodedMethod가 포함됩니다.In the following code example, the class named MyService contains two XML Web service methods, MyLiteralMethod and MyEncodedMethod. 두 메서드 모두 Order 클래스의 인스턴스를 반환하는 동일한 기능을 수행합니다.Both methods perform the same function: returning an instance of the Order class. Order 클래스에서 XmlTypeAttributeSoapTypeAttribute 특성이 둘 다 OrderID 필드에 적용되며 두 특성의 ElementName 속성은 서로 다르게 설정됩니다.In the Order class, the XmlTypeAttribute and the SoapTypeAttribute attributes are both applied to the OrderID field, and both attributes have their ElementName property set to different values.

예제를 실행하려면 코드를 .asmx 확장명의 파일로 붙여넣은 다음 파일을 IIS(인터넷 정보 서비스)에서 관리하는 가상 디렉터리에 넣습니다.To run the example, paste the code into a file with an .asmx extension, and place the file into a virtual directory managed by Internet Information Services (IIS). Internet Explorer와 같은 HTML 브라우저에서 컴퓨터, 가상 디렉터리 및 파일의 이름을 입력합니다.From an HTML browser, such as Internet Explorer, type the name of the computer, virtual directory, and file.

<%@ 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를 호출합니다.The following code example calls MyLiteralMethod. 요소 이름이 "LiteralOrderID"로 변경됩니다.The element name is changed to "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를 호출합니다.The following code example calls MyEncodedMethod. 요소 이름은 "EncodedOrderID"입니다.The element name is "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>  

특성을 반환 값에 적용Applying Attributes to Return Values

또한 특성을 반환 값에 적용하여 네임스페이스, 요소 이름 등을 제어할 수도 있습니다.You can also apply attributes to return values to control the namespace, element name, and so forth. 다음 코드 예제에서는 XmlElementAttribute 특성을 MyLiteralMethod 메서드의 반환 값에 적용합니다.The following code example applies the XmlElementAttribute attribute to the return value of the MyLiteralMethod method. 이렇게 하면 네임스페이스와 요소 이름을 제어할 수 있습니다.Doing so allows you to control the namespace and element name.

<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을 반환합니다.When invoked, the code returns XML that resembles the following.

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

매개 변수에 적용되는 특성Attributes Applied to Parameters

또한 특성을 매개 변수에 적용하여 네임스페이스, 요소 이름 등을 지정할 수도 있습니다.You can also apply attributes to parameters to specify namespace, element name and so forth. 다음 코드 예제에서는 매개 변수를 MyLiteralMethodResponse 메서드에 추가하고 XmlAttributeAttribute 특성을 매개 변수에 적용합니다.The following code example adds a parameter to the MyLiteralMethodResponse method, and applies the XmlAttributeAttribute attribute to the parameter. 요소 이름과 네임스페이스는 모두 매개 변수에 대해 설정됩니다.The element name and namespace are both set for the parameter.

<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 요청은 다음과 같습니다.The SOAP request would resemble the following.

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

특성을 클래스에 적용Applying Attributes to Classes

클래스에 관련된 요소의 네임스페이스를 제어하려면 필요에 따라 XmlTypeAttribute, XmlRootAttributeSoapTypeAttribute를 적용할 수 있습니다.If you need to control the namespace of elements that correlate to classes, you can apply XmlTypeAttribute, XmlRootAttribute, and SoapTypeAttribute, as appropriate. 다음 코드 예제에서는 세 가지 모두를 Order 클래스에 적용합니다.The following code example applies all three to the Order class.

<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;  
}  

XmlTypeAttributeSoapTypeAttribute를 적용한 결과는 다음 코드 예제에서처럼 서비스 설명에서 확인할 수 있습니다.The results of applying the XmlTypeAttribute and SoapTypeAttribute can be seen when you examine the service description, as shown in the following code example.

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

XmlRootAttribute의 효과는 다음과 같이 HTTP GET 및 HTTP POST 결과에서도 볼 수 있습니다.The effect of the XmlRootAttribute can also be seen in the HTTP GET and HTTP POST results, as follows.

<?xml version="1.0" encoding="utf-8"?>  
<BookOrderForm xmlns="http://tempuri.org/">  
    <LiteralOrderID>string</LiteralOrderID>  
</BookOrderForm>  

참고 항목See also