다음을 통해 공유


System.Xml.Serialization.XmlSerializer 클래스

이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.

XML serialization은 스토리지 또는 전송을 위해 개체의 공용 속성 및 필드를 직렬 형식(이 경우 XML)으로 변환하는 프로세스입니다. 역직렬화는 XML 출력에서 원래 상태로 개체를 다시 만듭니다. serialization은 개체의 상태를 스트림 또는 버퍼에 저장하는 방법으로 생각할 수 있습니다. 예를 들어 ASP.NET 클래스를 XmlSerializer 사용하여 XML 웹 서비스 메시지를 인코딩합니다.

개체의 데이터는 클래스, 필드, 속성, 기본 형식, 배열 및 내장 XML 형태인 XmlElement 또는 XmlAttribute 개체와 같은 프로그래밍 언어 구문을 사용하여 표현됩니다. 고유한 클래스를 만들거나, 특성으로 주석을 추가하거나, XML 스키마 정의 도구(Xsd.exe) 를 사용하여 기존 XSD(XML 스키마 정의) 문서를 기반으로 클래스를 생성할 수 있습니다. XML 스키마가 있는 경우, Xsd.exe을 실행하여 스키마에 강력하게 타입화된 클래스 집합을 생성할 수 있으며, 직렬화 시 스키마를 준수하도록 속성으로 주석이 달립니다.

개체와 XML 간에 데이터를 전송하려면 프로그래밍 언어 구문에서 XML 스키마로, XML 스키마에서 프로그래밍 언어 구문으로 매핑해야 합니다. XmlSerializer 및 Xsd.exe 같은 관련 도구는 디자인 타임과 런타임 모두에서 이 두 기술을 연결하는 다리를 제공합니다. 디자인 타임에 Xsd.exe 사용하여 사용자 지정 클래스에서 XML 스키마 문서(.xsd)를 생성하거나 지정된 스키마에서 클래스를 생성합니다. 두 경우 모두 클래스에 사용자 지정 특성이 주석으로 추가되어 XML 스키마 시스템과 공용 언어 런타임 간에 매핑하는 방법을 지시 XmlSerializer 합니다. 런타임에 클래스의 인스턴스를 지정된 스키마 뒤에 있는 XML 문서로 serialize할 수 있습니다. 마찬가지로 이러한 XML 문서는 런타임 개체로 역직렬화될 수 있습니다. XML 스키마는 선택 사항이며 디자인 타임이나 런타임에는 필요하지 않습니다.

생성된 XML을 제어하기

생성된 XML을 제어하려면 클래스 및 멤버에 특수 특성을 적용할 수 있습니다. 예를 들어, 다른 XML 요소 이름을 지정하려면, 공용 필드 또는 속성에 XmlElementAttribute를 적용하고 ElementName 속성을 설정하십시오. 유사한 특성의 전체 목록은 XML Serialization을 제어하는 특성을 참조하세요. XML 출력을 IXmlSerializable 제어하는 인터페이스를 구현할 수도 있습니다.

XML이 World Wide 컨소시엄 문서 Simple Object Access Protocol (SOAP) 1.1 섹션 5를 준수하도록 생성되어야 한다면, XmlSerializer를 사용하여 XmlTypeMapping을 구성해야 합니다. 인코딩된 SOAP XML을 추가로 제어하려면 인코딩된 SOAP Serialization을 제어하는 특성에 나열된 특성을 사용합니다.

이를 통해 XmlSerializer 강력한 형식의 클래스 작업을 활용할 수 있으며 XML의 유연성이 있습니다. 형식이 XmlElement, XmlAttribute 또는 XmlNode인 필드나 속성을 사용하여, 강력하게 형식화된 클래스에서 XML 문서의 일부를 XML 객체로 직접 읽을 수 있습니다.

확장 가능한 XML 스키마를 사용하는 경우 XmlAnyElementAttributeXmlAnyAttributeAttribute 특성을 사용하여 원래 스키마에서 찾을 수 없는 요소나 특성을 직렬화하고 역직렬화할 수도 있습니다. 개체를 사용하려면, XmlAnyElementAttribute를 개체 배열을 반환하는 필드에 적용하거나 XmlElementXmlAnyAttributeAttribute 개체 배열을 반환하는 필드에 적용합니다.

속성 또는 필드가 복합 개체(예: 배열 또는 클래스 인스턴스) XmlSerializer 를 반환하는 경우 기본 XML 문서 내에 중첩된 요소로 변환합니다. 예를 들어 다음 코드의 첫 번째 클래스는 두 번째 클래스의 인스턴스를 반환합니다.

Public Class MyClass
    Public MyObjectProperty As MyObject
End Class

Public Class MyObject
    Public ObjectName As String
End Class
public class MyClass
{
    public MyObject MyObjectProperty;
}
public class MyObject
{
    public string ObjectName;
}

직렬화된 XML 출력은 다음과 같습니다.

<MyClass>
  <MyObjectProperty>
  <ObjectName>My String</ObjectName>
  </MyObjectProperty>
</MyClass>

스키마에 선택적 요소(minOccurs = '0')가 포함되어 있거나 스키마에 기본값이 포함된 경우 두 가지 옵션이 있습니다. 한 가지 옵션은 다음 코드와 같이 기본값을 지정하는 데 사용하는 System.ComponentModel.DefaultValueAttribute 것입니다.

Public Class PurchaseOrder
    <System.ComponentModel.DefaultValueAttribute ("2002")> _
    Public Year As String
End Class
public class PurchaseOrder
{
    [System.ComponentModel.DefaultValueAttribute ("2002")]
    public string Year;
}

또 다른 옵션은 특수 패턴을 사용하여 XmlSerializer가 인식하는 부울 필드를 생성하고, XmlIgnoreAttribute를 필드에 적용하는 것입니다. 패턴은 .의 propertyNameSpecified형태로 만들어집니다. 예를 들어 "MyFirstName"이라는 필드가 있는 경우 "MyFirstName"이라는 XML 요소를 생성할지 여부를 지시 XmlSerializer 하는 "MyFirstNameSpecified"라는 필드도 만듭니다. 이 방법은 다음 예제에서 확인할 수 있습니다.

Public Class OptionalOrder
    ' This field's value should not be serialized
    ' if it is uninitialized.
    Public FirstOrder As String

    ' Use the XmlIgnoreAttribute to ignore the
    ' special field named "FirstOrderSpecified".
    <System.Xml.Serialization.XmlIgnoreAttribute> _
    Public FirstOrderSpecified As Boolean
End Class
public class OptionalOrder
{
    // This field should not be serialized
    // if it is uninitialized.
    public string FirstOrder;

    // Use the XmlIgnoreAttribute to ignore the
    // special field named "FirstOrderSpecified".
    [System.Xml.Serialization.XmlIgnoreAttribute]
    public bool FirstOrderSpecified;
}

기본 직렬화 재정의

적절한 특성 중 하나를 만들고 XmlAttributes 클래스의 인스턴스에 추가하여 개체 집합과 해당 필드 및 속성 집합의 serialization을 재정의할 수도 있습니다. 이러한 방식으로 serialization을 재정의하는 데는 두 가지 용도가 있습니다. 먼저 원본에 대한 액세스 권한이 없더라도 DLL에 있는 개체의 serialization을 제어하고 보강할 수 있습니다. 둘째, 직렬화 가능한 클래스 집합을 하나 만들 수 있지만 여러 가지 방법으로 개체를 직렬화할 수 있습니다. 자세한 내용은 클래스 및 XmlAttributeOverrides 참조 하세요.

Serialize 메서드를 호출하여 개체를 직렬화합니다. 개체를 역직렬화하려면 메서드를 호출합니다 Deserialize .

XML 문서에 XML 네임스페이스를 추가하려면 다음을 참조하세요 XmlSerializerNamespaces.

비고

XmlSerializerIEnumerable 또는 ICollection를 구현하는 클래스에 특별한 처리를 제공합니다. 구현하는 클래스는 IEnumerable 단일 매개 변수를 사용하는 public Add 메서드를 구현해야 합니다. 메서드의 매개 변수는 Add에서 반환된 값의 Current 속성과 동일한 형식이거나 그 형식의 기본 형식 중 하나여야 합니다. ICollection (예: CollectionBase)와 함께 IEnumerable를 구현하는 클래스는 정수를 받는 public Item 인덱스 속성(C#의 인덱서)을 가져야 하며, 정수 형식의 public Count 속성을 가져야 합니다. 메서드에 대한 Add 매개 변수는 속성 또는 Item 해당 형식의 베이스 중 하나에서 반환되는 형식과 동일해야 합니다. ICollection을(를) 구현하는 클래스의 경우, 직렬화해야 할 값은 Item을(를) 호출하지 않고 인덱싱된 GetEnumerator 속성에서 검색됩니다.

개체를 역직렬화하려면 임시 디렉터리(TEMP 환경 변수에 정의된 대로)에 쓸 수 있는 권한이 있어야 합니다.

동적으로 생성된 어셈블리

성능을 높이기 위해 XML serialization 인프라는 지정된 형식을 직렬화하고 역직렬화하는 어셈블리를 동적으로 생성합니다. 인프라는 해당 어셈블리를 찾아 재사용합니다. 이 동작은 다음 생성자를 사용하는 경우에만 발생합니다.

XmlSerializer.XmlSerializer(Type)

XmlSerializer.XmlSerializer(Type, String)

다른 생성자를 사용하는 경우 동일한 어셈블리의 여러 버전이 생성되고 언로드되지 않으므로 메모리 누수 및 성능 저하가 발생합니다. 가장 쉬운 해결 방법은 앞에서 언급한 두 생성자 중 하나를 사용하는 것입니다. 그렇지 않으면 다음 예제와 같이 어셈블리를 Hashtable캐시해야 합니다.

Hashtable serializers = new Hashtable();

// Use the constructor that takes a type and XmlRootAttribute.
XmlSerializer s = new XmlSerializer(typeof(MyClass), myRoot);

// Implement a method named GenerateKey that creates unique keys
// for each instance of the XmlSerializer. The code should take
// into account all parameters passed to the XmlSerializer
// constructor.
object key = GenerateKey(typeof(MyClass), myRoot);

// Check the local cache for a matching serializer.
XmlSerializer ser = (XmlSerializer)serializers[key];
if (ser == null)
{
    ser = new XmlSerializer(typeof(MyClass), myRoot);
    // Cache the serializer.
    serializers[key] = ser;
}

// Use the serializer to serialize or deserialize.
Dim serializers As New Hashtable()

' Use the constructor that takes a type and XmlRootAttribute.
Dim s As New XmlSerializer(GetType([MyClass]), myRoot)

' Implement a method named GenerateKey that creates unique keys
' for each instance of the XmlSerializer. The code should take
' into account all parameters passed to the XmlSerializer
' constructor.
Dim key As Object = GenerateKey(GetType([MyClass]), myRoot)

' Check the local cache for a matching serializer.
Dim ser As XmlSerializer = CType(serializers(key), XmlSerializer)

If ser Is Nothing Then
    ser = New XmlSerializer(GetType([MyClass]), myRoot)
    ' Cache the serializer.
    serializers(key) = ser
End If

' Use the serializer to serialize or deserialize.

ArrayList 및 제네릭 리스트의 직렬화

XmlSerializer는 다음을 직렬화하거나 역직렬화할 수 없습니다.

부호 없는 Long 열거형의 직렬화

XmlSerializer 다음 조건이 true이면 열거형을 serialize하도록 인스턴스화할 수 없습니다. 열거형은 부호 없는 longulong 형식(C#)이며 열거형에는 값이 9,223,372,036,854,775,807보다 큰 멤버가 포함됩니다. 예를 들어 다음을 serialize할 수 없습니다.

public enum LargeNumbers: ulong
{
    a = 9223372036854775808
}
// At run time, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));

사용되지 않는 형식

클래스는 XmlSerializer 로 표시된 [Obsolete]개체를 serialize하지 않습니다.