다음을 통해 공유


특성을 사용하여 XML Serialization 제어

특성을 사용하여 개체의 XML serialization을 제어하거나 동일한 클래스 집합에서 대체 XML 스트림을 만들 수 있습니다. 대체 XML 스트림 만들기에 대한 자세한 내용은 방법: XML 스트림의 대체 요소 이름 지정을 참조하십시오.

2baksw0z.note(ko-kr,VS.100).gif참고:
생성된 XML이 World Wide Web 컨소시엄(www.w3.org) 문서 "SOAP(Simple Object Access Protocol) 1.1"의 5단원을 따르도록 하려면 인코딩된 SOAP Serialization을 제어하는 특성에 나열된 특성을 사용합니다.

기본적으로 XML 요소 이름은 클래스 또는 멤버 이름으로 결정됩니다. Book이라는 간단한 클래스의 경우 이름이 ISBN인 필드는 다음 예제처럼 XML 요소 태그 <ISBN>을 생성합니다.

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

요소에 새 이름을 지정하려면 이 기본 동작을 변경할 수 있습니다. 다음 코드에서는 XmlElementAttributeElementName 속성을 설정하여 특성을 통해 기본 동작을 변경하는 방법을 보여 줍니다.

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

특성에 대한 자세한 내용은 Extending Metadata Using Attributes을 참조하십시오. XML serialization을 제어하는 특성의 목록은 XML Serialization을 제어하는 특성을 참조하십시오.

배열 serialization 제어

XmlArrayAttributeXmlArrayItemAttribute 특성은 배열의 serialization을 제어하도록 디자인되었습니다. 이러한 특성을 사용하면 World Wide Web 컨소시엄[www.w3.org] 문서 "XML Schema Part 2: Datatypes"에 정의된 대로 요소 이름, 네임스페이스 및 XML 스키마(XSD) 데이터 형식을 제어할 수 있습니다. 또한 배열에 포함될 수 있는 형식을 지정할 수도 있습니다.

XmlArrayAttribute는 배열이 serialize될 때 발생하는 바깥쪽 XML 요소의 속성을 결정합니다. 예를 들어 기본적으로 아래 배열을 serialize하면 Employees라는 이름의 XML 요소가 생성됩니다. Employees 요소에는 배열 형식 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된 인스턴스는 다음과 같을 수 있습니다.

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

XmlArrayAttribute를 적용하여 다음과 같이 XML 요소의 이름을 변경할 수 있습니다.

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

결과 XML은 다음과 같을 수 있습니다.

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

반면 XmlArrayItemAttribute는 배열에 포함된 항목을 serialize하는 방법을 제어합니다. 특성은 배열을 반환하는 필드에 적용됩니다.

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

결과 XML은 다음과 같을 수 있습니다.

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

파생 클래스 serialize

XmlArrayItemAttribute의 다른 용도는 파생 클래스의 serialize를 가능하게 하는 것입니다. 예를 들어 Employee에서 파생되는 Manager라는 다른 클래스를 이전 예제에 추가할 수 있습니다. XmlArrayItemAttribute를 적용하지 않으면 파생된 클래스 형식이 인식되지 않기 때문에 코드는 런타임에 실패합니다. 이를 해결하려면 사용 가능한 각 형식(기본 및 파생)에 대해 Type 속성을 설정할 때마다 특성을 적용하여 두 번 적용합니다.

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된 인스턴스는 다음과 같을 수 있습니다.

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

배열을 요소 시퀀스로 serialize

다음과 같이 배열을 반환하는 필드에 XmlElementAttribute를 적용하여 배열을 XML 요소의 평면 시퀀스로 serialize할 수도 있습니다.

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

serialize된 인스턴스는 다음과 같을 수 있습니다.

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

두 XML 스트림을 구분하는 다른 방법은 XML 스키마 정의 도구를 사용하여 컴파일된 코드에서 XML 스키마(XSD) 문서를 생성하는 것입니다. 이 도구 사용에 대한 자세한 내용은 XML 스키마 정의 도구 및 XML Serialization을 참조하십시오. 필드에 특성이 적용되지 않은 경우 스키마는 다음 방식으로 요소를 설명합니다.

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

XmlElementAttribute가 필드에 적용되는 경우 결과 스키마는 다음과 같이 요소를 설명합니다.

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

ArrayList serialize

ArrayList 클래스에는 다양한 개체의 컬렉션이 포함될 수 있습니다. 따라서 ArrayList는 배열을 사용할 때 여러 번 사용할 수 있습니다. 하지만 형식화된 개체의 배열을 반환하는 필드를 만드는 대신 단일 ArrayList를 반환하는 필드를 만들 수 있습니다. 하지만 배열과 마찬가지로 ArrayList에 포함된 개체 형식을 XmlSerializer에 알려야 합니다. 이렇게 하려면 다음 예제처럼 XmlElementAttribute의 여러 인스턴스를 필드에 할당합니다.

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

클래스에 적용할 수 있는(클래스에만 적용 가능) XmlRootAttributeXmlTypeAttribute의 두 특성이 있습니다. 이 두 특성은 매우 유사합니다. XmlRootAttribute는 serialize되었을 때 XML 문서의 열기 및 닫기 요소(즉, 루트 요소)를 나타내는 클래스인 하나의 클래스에만 적용될 수 있습니다. 반면 XmlTypeAttribute는 루트 클래스를 포함한 모든 클래스에 적용할 수 있습니다.

예를 들어 이전 예제에서 Group 클래스는 루트 클래스이며 이 클래스의 모든 public 필드와 속성은 XML 문서에서 찾을 수 있는 XML 요소가 됩니다. 따라서 하나의 루트 클래스만 있을 수 있습니다. XmlRootAttribute를 적용하면 XmlSerializer로 생성된 XML 스트림을 제어할 수 있습니다. 예를 들어 요소 이름과 네임스페이스를 변경할 수 있습니다.

XmlTypeAttribute를 사용하면 생성된 XML의 스키마를 제어할 수 있습니다. 이 기능은 XML Web services를 통해 스키마를 게시해야 할 때 유용합니다. 다음 예제에서는 XmlTypeAttributeXmlRootAttribute를 같은 클래스에 적용합니다.

<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을 볼 수 있습니다.

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

이와 반대로 클래스의 인스턴스를 serialize하면 NewGroupName이 XML 문서에 나타납니다.

<NewGroupName>
    . . .
</NewGroupName>

XmlIgnoreAttribute로 serialization 방지

public 속성이나 필드를 serialize할 필요가 없는 상황이 있을 수 있습니다. 예를 들어 메타데이터를 포함하기 위해 필드나 속성을 사용할 수 있습니다. 이러한 경우에는 XmlIgnoreAttribute를 필드 또는 속성에 적용하면 XmlSerializer가 이를 건너뜁니다.

참고 항목

작업

방법: XML 스트림의 대체 요소 이름 지정
방법: 개체 Serialize
방법: 개체 Deserialize

개념

XML Serialization을 제어하는 특성
인코딩된 SOAP Serialization을 제어하는 특성
XML Serialization 소개
XML Serialization 예제