다음을 통해 공유


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

생성된 XML 제어

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

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

이를 통해 XmlSerializer 강력한 형식의 클래스 작업을 활용할 수 있으며 XML의 유연성이 있습니다. 형식 XmlElementXmlAttribute 의 필드나 속성을 사용하거나 XmlNode 강력한 형식의 클래스에서 XML 문서의 일부를 XML 개체로 직접 읽을 수 있습니다.

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

속성 또는 필드가 복합 개체(예: 배열 또는 클래스 인스턴스)를 반환하는 경우 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;
}

기본 serialization 재정의

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

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

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

참고 항목

구현 XmlSerializer 또는 ICollection클래스에 IEnumerable 특별 한 처리를 제공 합니다. 구현하는 클래스는 IEnumerable 단일 매개 변수를 사용하는 public Add 메서드를 구현해야 합니다. 메서드의 매개 변수는 Add 반환된 값 또는 해당 형식의 기준 중 하나에 있는 속성에서 GetEnumerator반환 Current 되는 형식과 동일한 형식이어야 합니다. 정수로 사용하는 public Item 인덱싱 ICollection 된 속성(C#의 인덱서)이 있어야 하고 형식 정수의 public Count 속성이 있어야 합니다(예: CollectionBase)IEnumerable를 구현하는 클래스입니다. 메서드에 대한 Add 매개 변수는 속성 또는 Item 해당 형식의 베이스 중 하나에서 반환되는 형식과 동일해야 합니다. 구현ICollection하는 클래스의 경우 serialize할 값은 호출GetEnumerator이 아니라 인덱싱된 Item 속성에서 검색됩니다.

개체를 역직렬화하려면 임시 디렉터리(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 및 제네릭 목록의 serialization

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

부호 없는 Long 열거형의 serialization

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하지 않습니다.