특성을 사용하여 XML Serialization 제어Controlling XML Serialization Using Attributes

특성을 사용하여 개체의 XML serialization을 제어하거나 동일한 클래스 집합에서 대체 XML 스트림을 만들 수 있습니다.Attributes can be used to control the XML serialization of an object or to create an alternate XML stream from the same set of classes. 대체 XML 스트림 만들기에 대한 자세한 내용은 방법: XML 스트림의 대체 요소 이름 지정을 참조하세요.For more details about creating an alternate XML stream, see How to: Specify an Alternate Element Name for an XML Stream.

참고

생성된 XML이 World Wide Web 컨소시엄(W3C) 문서 SOAP(Simple Object Access Protocol) 1.1의 5단원을 따르도록 하려면 인코딩된 SOAP Serialization을 제어하는 특성에 나열된 특성을 사용합니다.If the XML generated must conform to section 5 of the World Wide Web Consortium (W3C) document titled Simple Object Access Protocol (SOAP) 1.1, use the attributes listed in Attributes That Control Encoded SOAP Serialization.

기본적으로 XML 요소 이름은 클래스 또는 멤버 이름으로 결정됩니다.By default, an XML element name is determined by the class or member name. Book이라는 간단한 클래스의 경우 이름이 ISBN인 필드는 다음 예제처럼 XML 요소 태그 <ISBN>을 생성합니다.In a simple class named Book, a field named ISBN will produce an XML element tag <ISBN>, as shown in the following example.

Public Class Book
    Public ISBN As String
End Class
' When an instance of the Book class is serialized, it might
' produce this XML:
' <ISBN>1234567890</ISBN>.
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.

요소에 새 이름을 지정하려면 이 기본 동작을 변경할 수 있습니다.This default behavior can be changed if you want to give the element a new name. 다음 코드에서는 ElementNameXmlElementAttribute 속성을 설정하여 특성을 통해 기본 동작을 변경하는 방법을 보여 줍니다.The following code shows how an attribute enables this by setting the ElementName property of a XmlElementAttribute.

Public Class TaxRates
   < XmlElement(ElementName = "TaxRate")> _
    Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

특성에 대한 자세한 내용은 특성을 참조하세요.For more information about attributes, see Attributes. XML serialization을 제어하는 특성의 목록은 XML Serialization을 제어하는 특성을 참조하세요.For a list of attributes that control XML serialization, see Attributes That Control XML Serialization.

배열 serialization 제어Controlling Array Serialization

XmlArrayAttributeXmlArrayItemAttribute 특성은 배열의 serialization을 제어하도록 디자인되었습니다.The XmlArrayAttribute and the XmlArrayItemAttribute attributes are designed to control the serialization of arrays. 이러한 특성을 사용하여 요소 이름, 네임스페이스 및 XML 스키마(XSD) 데이터 유형을 제어할 수 있습니다(World Wide Web 컨소시엄[www.w3.org] 문서 "XML Schema Part 2: Datatypes"에 정의된 대로).Using these attributes, you can control the element name, namespace, and XML Schema (XSD) data type (as defined in the World Wide Web Consortium [www.w3.org] document titled "XML Schema Part 2: Datatypes"). 또한 배열에 포함될 수 있는 형식을 지정할 수도 있습니다.You can also specify the types that can be included in an array.

XmlArrayAttribute는 배열이 serialize될 때 발생하는 바깥쪽 XML 요소의 속성을 결정합니다.The XmlArrayAttribute will determine the properties of the enclosing XML element that results when an array is serialized. 예를 들어 기본적으로 아래 배열을 serialize하면 Employees라는 이름의 XML 요소가 생성됩니다.For example, by default, serializing the array below will result in an XML element named Employees. Employees 요소에는 배열 형식 Employee를 따라 이름이 지정된 일련의 요소가 포함됩니다.The Employees element will contain a series of elements named after the array type Employee.

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
public class Group {
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}

serialize된 인스턴스는 다음과 같을 수 있습니다.A serialized instance might resemble the following.

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</Employees>
</Group>

XmlArrayAttribute를 적용하여 다음과 같이 XML 요소의 이름을 변경할 수 있습니다.By applying a XmlArrayAttribute, you can change the name of the XML element, as follows.

Public Class Group
    <XmlArray("TeamMembers")> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

결과 XML은 다음과 같을 수 있습니다.The resulting XML might resemble the following.

<Group>
<TeamMembers>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</TeamMembers>
</Group>

반면 XmlArrayItemAttribute는 배열에 포함된 항목을 serialize하는 방법을 제어합니다.The XmlArrayItemAttribute, on the other hand, controls how the items contained in the array are serialized. 특성은 배열을 반환하는 필드에 적용됩니다.Note that the attribute is applied to the field returning the array.

Public Class Group
    <XmlArrayItem("MemberName")> _
    Public Employee() As Employees
End Class
public class Group {
    [XmlArrayItem("MemberName")]
    public Employee[] Employees;
}

결과 XML은 다음과 같을 수 있습니다.The resulting XML might resemble the following.

<Group>
<Employees>
    <MemberName>Haley</MemberName>
</Employees>
</Group>

파생 클래스 serializeSerializing Derived Classes

XmlArrayItemAttribute의 다른 용도는 파생 클래스의 serialize를 가능하게 하는 것입니다.Another use of the XmlArrayItemAttribute is to allow the serialization of derived classes. 예를 들어 Manager에서 파생되는 Employee라는 다른 클래스를 이전 예제에 추가할 수 있습니다.For example, another class named Manager that derives from Employee can be added to the previous example. XmlArrayItemAttribute를 적용하지 않으면 파생된 클래스 형식이 인식되지 않기 때문에 코드는 런타임에 실패합니다.If you do not apply the XmlArrayItemAttribute, the code will fail at run time because the derived class type will not be recognized. 이를 해결하려면 사용 가능한 각 형식(기본 및 파생)에 대해 Type 속성을 설정할 때마다 특성을 적용하여 두 번 적용합니다.To remedy this, apply the attribute twice, each time setting the Type property for each acceptable type (base and derived).

Public Class Group
    <XmlArrayItem(Type:=GetType(Employee)), _
    XmlArrayItem(Type:=GetType(Manager))> _
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
Public Class Manager
Inherits Employee
    Public Level As Integer
End Class
public class Group {
    [XmlArrayItem(Type = typeof(Employee)),
    XmlArrayItem(Type = typeof(Manager))]
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}
public class Manager:Employee {
    public int Level;
}

serialize된 인스턴스는 다음과 같을 수 있습니다.A serialized instance might resemble the following.

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
    <Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    </Employee>
</Employees>
</Group>

배열을 요소 시퀀스로 serializeSerializing an Array as a Sequence of Elements

다음과 같이 배열을 반환하는 필드에 XmlElementAttribute를 적용하여 배열을 XML 요소의 평면 시퀀스로 serialize할 수도 있습니다.You can also serialize an array as a flat sequence of XML elements by applying a XmlElementAttribute to the field returning the array as follows.

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlElement]
    public Employee[] Employees;
}

serialize된 인스턴스는 다음과 같을 수 있습니다.A serialized instance might resemble the following.

<Group>
<Employees>
    <Name>Haley</Name>
</Employees>
<Employees>
    <Name>Noriko</Name>
</Employees>
<Employees>
    <Name>Marco</Name>
</Employees>
</Group>

두 XML 스트림을 구분하는 다른 방법은 XML 스키마 정의 도구를 사용하여 컴파일된 코드에서 XML 스키마(XSD) 문서를 생성하는 것입니다.Another way to differentiate the two XML streams is to use the XML Schema Definition tool to generate the XML Schema (XSD) document files from the compiled code. 도구 사용에 대한 자세한 내용은 XML 스키마 정의 도구 및 XML serialization을 참조하세요. 필드에 특성이 적용되지 않은 경우 스키마는 다음 방식으로 요소를 설명합니다.(For more details on using the tool, see The XML Schema Definition Tool and XML Serialization.) When no attribute is applied to the field, the schema describes the element in the following manner.

<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />

XmlElementAttribute가 필드에 적용되는 경우 결과 스키마는 다음과 같이 요소를 설명합니다.When the XmlElementAttribute is applied to the field, the resulting schema describes the element as follows.

<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />

ArrayList serializeSerializing an ArrayList

ArrayList 클래스에는 다양한 개체의 컬렉션이 포함될 수 있습니다.The ArrayList class can contain a collection of diverse objects. 따라서 ArrayList는 배열을 사용할 때 여러 번 사용할 수 있습니다.You can therefore use a ArrayList much as you use an array. 하지만 형식화된 개체의 배열을 반환하는 필드를 만드는 대신 단일 ArrayList를 반환하는 필드를 만들 수 있습니다.Instead of creating a field that returns an array of typed objects, however, you can create a field that returns a single ArrayList. 하지만 배열과 마찬가지로 XmlSerializer에 포함된 개체 형식을 ArrayList에 알려야 합니다.However, as with arrays, you must inform the XmlSerializer of the types of objects the ArrayList contains. 이렇게 하려면 다음 예제처럼 XmlElementAttribute의 여러 인스턴스를 필드에 할당합니다.To accomplish this, assign multiple instances of the XmlElementAttribute to the field, as shown in the following example.

Public Class Group
    <XmlElement(Type:=GetType(Employee)), _
    XmlElement(Type:=GetType(Manager))> _
    Public Info As ArrayList
End Class
public class Group {
    [XmlElement(Type = typeof(Employee)),
    XmlElement(Type = typeof(Manager))]
    public ArrayList Info;
}

XmlRootAttribute 및 XmlTypeAttribute를 사용하여 클래스의 serialization 제어Controlling Serialization of Classes Using XmlRootAttribute and XmlTypeAttribute

클래스에 적용할 수 있는(클래스에만 적용 가능) XmlRootAttributeXmlTypeAttribute의 두 특성이 있습니다.There are two attributes that can be applied to a class (and only a class): XmlRootAttribute and XmlTypeAttribute. 이 두 특성은 매우 유사합니다.These attributes are very similar. XmlRootAttribute는 serialize되었을 때 XML 문서의 열기 및 닫기 요소(즉, 루트 요소)를 나타내는 클래스인 하나의 클래스에만 적용될 수 있습니다.The XmlRootAttribute can be applied to only one class: the class that, when serialized, represents the XML document's opening and closing element—in other words, the root element. 반면 XmlTypeAttribute는 루트 클래스를 포함한 모든 클래스에 적용할 수 있습니다.The XmlTypeAttribute, on the other hand, can be applied to any class, including the root class.

예를 들어 이전 예제에서 Group 클래스는 루트 클래스이며 이 클래스의 모든 public 필드와 속성은 XML 문서에서 찾을 수 있는 XML 요소가 됩니다.For example, in the previous examples, the Group class is the root class, and all its public fields and properties become the XML elements found in the XML document. 따라서 하나의 루트 클래스만 있을 수 있습니다.Therefore, there can be only one root class. XmlRootAttribute를 적용하면 XmlSerializer로 생성된 XML 스트림을 제어할 수 있습니다.By applying the XmlRootAttribute, you can control the XML stream generated by the XmlSerializer. 예를 들어 요소 이름과 네임스페이스를 변경할 수 있습니다.For example, you can change the element name and namespace.

XmlTypeAttribute를 사용하면 생성된 XML의 스키마를 제어할 수 있습니다.The XmlTypeAttribute allows you to control the schema of the generated XML. 이 기능은 XML Web services를 통해 스키마를 게시해야 할 때 유용합니다.This capability is useful when you need to publish the schema through an XML Web service. 다음 예제에서는 XmlTypeAttributeXmlRootAttribute를 같은 클래스에 적용합니다.The following example applies both the XmlTypeAttribute and the XmlRootAttribute to the same class.

<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
    Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
    public Employee[] Employees;
}

이 클래스가 컴파일되고 XML 스키마 정의 도구가 스키마 생성에 사용되는 경우 Group을 설명하는 다음 XML을 볼 수 있습니다.If this class is compiled, and the XML Schema Definition tool is used to generate its schema, you would find the following XML describing Group.

<xs:element name="NewGroupName" type="NewTypeName" />

이와 반대로 클래스의 인스턴스를 serialize하면 NewGroupName이 XML 문서에 나타납니다.In contrast, if you were to serialize an instance of the class, only NewGroupName would be found in the XML document.

<NewGroupName>
    . . .
</NewGroupName>

XmlIgnoreAttribute로 serialization 방지Preventing Serialization with the XmlIgnoreAttribute

public 속성이나 필드를 serialize할 필요가 없는 상황이 있을 수 있습니다.There might be situations when a public property or field does not need to be serialized. 예를 들어 메타데이터를 포함하기 위해 필드나 속성을 사용할 수 있습니다.For example, a field or property could be used to contain metadata. 이러한 경우에는 XmlIgnoreAttribute를 필드 또는 속성에 적용하면 XmlSerializer가 이를 건너뜁니다.In such cases, apply the XmlIgnoreAttribute to the field or property and the XmlSerializer will skip over it.

참조See also