다음을 통해 공유


특성을 사용하여 XML serialization 제어

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

비고

생성된 XML이 SOAP(Simple Object Access Protocol) 1.1이라는 W3C(World Wide Web Consortium) 문서의 섹션 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;
}

특성에 대한 자세한 내용은 특성을 참조 하세요. XML serialization을 제어하는 특성 목록은 XML Serialization을 제어하는 특성을 참조하세요.

배열 직렬화 제어

XmlArrayAttributeXmlArrayItemAttribute 특성은 배열의 직렬화를 제어합니다. 이러한 특성을 사용하여 W3C 문서에 정의된 XML 스키마 파트 2: 데이터 형식에 정의된 대로 요소 이름, 네임스페이스 및 XSD(XML 스키마) 데이터 형식을 제어할 수 있습니다. 배열에 포함할 수 있는 형식을 지정할 수도 있습니다.

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

직렬화된 인스턴스는 다음 코드와 유사할 수 있습니다.

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

XmlArrayItemAttribute는 반면에 배열에 포함된 항목을 직렬화하는 방법을 제어합니다.

비고

배열을 반환하는 필드에 특성이 적용됩니다.

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>

파생 클래스 직렬화

파생 클래스의 XmlArrayItemAttribute serialization을 허용하는 것이 또 다른 용도입니다. 예를 들어, 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;
}

직렬화된 인스턴스는 다음 코드와 유사할 수 있습니다.

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

배열을 요소 시퀀스로 직렬화

XmlElementAttribute를 배열을 반환하는 필드에 적용함으로써 배열을 XML 요소의 플랫 시퀀스로 직렬화할 수도 있습니다.

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

직렬화된 인스턴스는 다음 코드와 유사할 수 있습니다.

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

두 XML 스트림을 구분하는 또 다른 방법은 XML 스키마 정의 도구를 사용하여 컴파일된 코드에서 XSD(XML 스키마) 문서 파일을 생성하는 것입니다. 도구 사용에 대한 자세한 내용은 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 직렬화

클래스에는 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두 개의 특성을 적용할 수 있습니다. 이러한 특성은 비슷합니다. 직렬화할 때 XML 문서의 여는 XmlRootAttribute 요소와 닫는 요소, 즉 루트 요소를 나타내는 클래스인 한 클래스에만 적용할 수 있습니다. XmlTypeAttribute반면에 루트 클래스를 비롯한 모든 클래스에 적용할 수 있습니다.

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

생성된 XmlTypeAttribute XML의 스키마를 제어할 수 있습니다. 이 기능은 XML 웹 서비스를 통해 스키마를 게시해야 하는 경우에 유용합니다. 다음 예제에서는 동일한 클래스에 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 스키마 정의 도구를 사용하여 스키마를 생성하는 경우 다음 XML에서 다음을 설명합니다 Group.

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

반면, 클래스의 인스턴스를 직렬화하는 경우 XML 문서에서만 NewGroupName을 찾을 수 있습니다.

<NewGroupName>
    . . .
</NewGroupName>

XmlIgnoreAttribute를 사용하여 Serialization 방지

공유 속성 또는 필드를 직렬화할 필요가 없는 상황에 직면할 수 있습니다. 예를 들어 필드 또는 속성을 사용하여 메타데이터를 포함할 수 있습니다. 이러한 경우 필드 또는 속성에 XmlIgnoreAttribute 적용하고 XmlSerializer 건너뜁니다.

참고하십시오