특성을 사용하여 XML Serialization 제어
특성을 사용하여 개체의 XML serialization을 제어하거나 동일한 클래스 집합에서 대체 XML 스트림을 만들 수 있습니다. 대체 XML 스트림 만들기에 대한 자세한 내용은 방법: XML 스트림의 대체 요소 이름 지정을 참조하십시오.
참고: |
---|
생성된 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>.
요소에 새 이름을 지정하려면 이 기본 동작을 변경할 수 있습니다. 다음 코드에서는 XmlElementAttribute의 ElementName 속성을 설정하여 특성을 통해 기본 동작을 변경하는 방법을 보여 줍니다.
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 제어
XmlArrayAttribute 및 XmlArrayItemAttribute 특성은 배열의 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 제어
클래스에 적용할 수 있는(클래스에만 적용 가능) XmlRootAttribute 및 XmlTypeAttribute의 두 특성이 있습니다. 이 두 특성은 매우 유사합니다. XmlRootAttribute는 serialize되었을 때 XML 문서의 열기 및 닫기 요소(즉, 루트 요소)를 나타내는 클래스인 하나의 클래스에만 적용될 수 있습니다. 반면 XmlTypeAttribute는 루트 클래스를 포함한 모든 클래스에 적용할 수 있습니다.
예를 들어 이전 예제에서 Group
클래스는 루트 클래스이며 이 클래스의 모든 public 필드와 속성은 XML 문서에서 찾을 수 있는 XML 요소가 됩니다. 따라서 하나의 루트 클래스만 있을 수 있습니다. XmlRootAttribute를 적용하면 XmlSerializer로 생성된 XML 스트림을 제어할 수 있습니다. 예를 들어 요소 이름과 네임스페이스를 변경할 수 있습니다.
XmlTypeAttribute를 사용하면 생성된 XML의 스키마를 제어할 수 있습니다. 이 기능은 XML Web services를 통해 스키마를 게시해야 할 때 유용합니다. 다음 예제에서는 XmlTypeAttribute 및 XmlRootAttribute를 같은 클래스에 적용합니다.
<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 예제