이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

XmlSerializer 클래스

2013-12-13

XML 문서 간에 개체를 직렬화 및 역직렬화합니다. XmlSerializer를 사용하면 개체가 XML로 인코딩되는 방식을 제어할 수 있습니다.

System.Object
  System.Xml.Serialization.XmlSerializer

Namespace:  System.Xml.Serialization
어셈블리:  System.Xml.Serialization(System.Xml.Serialization.dll)

public class XmlSerializer

XmlSerializer 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Protected 메서드XmlSerializer()인프라입니다. XmlSerializer 클래스의 새 인스턴스를 초기화합니다.
Public 메서드XmlSerializer(Type)지정된 형식의 개체를 XML 문서로 직렬화하고 XML 문서를 지정된 형식의 개체로 역직렬화할 수 있는 XmlSerializer 클래스의 새 인스턴스를 초기화합니다.
Public 메서드XmlSerializer(XmlTypeMapping)특정 형식을 다른 형식에 매핑하는 개체를 사용하여 XmlSerializer 클래스의 인스턴스를 초기화합니다.
Public 메서드XmlSerializer(Type, String)지정된 형식의 개체를 XML 문서로 직렬화하고 XML 문서를 지정된 형식의 개체로 역직렬화할 수 있는 XmlSerializer 클래스의 새 인스턴스를 초기화합니다. 모든 XML 요소의 기본 네임스페이스를 지정합니다.
Public 메서드XmlSerializer(Type, Type[])지정된 형식의 개체를 XML 문서로 직렬화하고 XML 문서를 지정된 형식의 개체로 역직렬화할 수 있는 XmlSerializer 클래스의 새 인스턴스를 초기화합니다. 필드 또는 속성이 배열을 반환하는 경우 extraTypes 매개 변수는 배열에 삽입될 수 있는 개체를 지정합니다.
Public 메서드XmlSerializer(Type, XmlAttributeOverrides)지정된 형식의 개체를 XML 문서로 직렬화하고 XML 문서를 지정된 형식의 개체로 역직렬화할 수 있는 XmlSerializer 클래스의 새 인스턴스를 초기화합니다. 직렬화되는 각 개체는 클래스의 인스턴스를 포함할 수 있으며, 이 오버로드는 다른 클래스로 재정의할 수 있습니다.
Public 메서드XmlSerializer(Type, XmlRootAttribute)지정된 형식의 개체를 XML 문서로 직렬화하고 XML 문서를 지정된 형식의 개체로 역직렬화할 수 있는 XmlSerializer 클래스의 새 인스턴스를 초기화합니다. 또한 XML 루트 요소로 사용할 클래스를 지정합니다.
Public 메서드XmlSerializer(Type, XmlAttributeOverrides, Type[], XmlRootAttribute, String)Object 형식의 개체를 XML 문서 인스턴스로 직렬화하고 XML 문서 인스턴스를 Object 형식의 개체로 역직렬화할 수 있는 XmlSerializer 클래스의 새 인스턴스를 초기화합니다. 직렬화할 각 개체 자체에 이 오버로드에서 다른 클래스로 재정의하는 클래스 인스턴스가 들어 있을 수 있습니다. 또한 이 오버로드는 모든 XML 요소의 기본 네임스페이스 및 XML 루트 요소로 사용할 클래스를 지정합니다.
맨 위

  이름설명
Public 메서드CanDeserializeXmlSerializer가 지정된 XML 문서를 역직렬화할 수 있는지 여부를 나타내는 값을 가져옵니다.
Public 메서드Deserialize(Stream)지정된 Stream에 포함된 XML 문서를 역직렬화합니다.
Public 메서드Deserialize(TextReader)지정된 TextReader에 포함된 XML 문서를 역직렬화합니다.
Public 메서드Deserialize(XmlReader)지정된 XmlReader에 포함된 XML 문서를 역직렬화합니다.
Public 메서드Equals(Object)지정한 Object가 현재 Object와 같은지 확인합니다. (Object에서 상속됨)
Protected 메서드Finalize가비지 수집기에서 Object를 회수하기 전에 개체가 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)
Public 메서드정적 멤버FromMappings(XmlMapping[])인프라입니다. XmlTypeMapping 개체의 배열에서 만들어진 XmlSerializer 개체의 배열을 반환합니다.
Public 메서드정적 멤버FromMappings(XmlMapping[], Type)인프라입니다. 지정된 매핑에 따라 XmlSerializer 클래스의 인스턴스를 반환합니다.
Public 메서드정적 멤버FromTypes형식 배열에서 만든 XmlSerializer 개체로 이루어진 배열을 반환합니다.
Public 메서드GetHashCode특정 형식에 대한 해시 함수 역할을 합니다. (Object에서 상속됨)
Public 메서드GetType현재 인스턴스의 Type을 가져옵니다. (Object에서 상속됨)
Protected 메서드MemberwiseClone현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)
Public 메서드Serialize(Stream, Object)지정된 Object를 직렬화하고 지정된 Stream를 사용하여 XML 문서를 파일에 씁니다.
Public 메서드Serialize(TextWriter, Object)지정된 Object를 직렬화하고 지정된 TextWriter를 사용하여 XML 문서를 파일에 씁니다.
Public 메서드Serialize(XmlWriter, Object)지정된 Object를 직렬화하고 지정된 XmlWriter를 사용하여 XML 문서를 파일에 씁니다.
Public 메서드Serialize(Stream, Object, XmlSerializerNamespaces)지정된 Object를 직렬화하고 지정된 네임스페이스를 참조하는 지정된 Stream을 사용하여 XML 문서를 파일에 씁니다.
Public 메서드Serialize(TextWriter, Object, XmlSerializerNamespaces)지정된 Object를 직렬화하고 지정된 TextWriter를 사용하여 XML 문서를 파일에 쓰며 지정된 네임스페이스를 참조합니다.
Public 메서드Serialize(XmlWriter, Object, XmlSerializerNamespaces)지정된 Object를 직렬화하고 지정된 XmlWriter를 사용하여 XML 문서를 파일에 쓰며 지정된 네임스페이스를 참조합니다.
Public 메서드ToString현재 개체를 나타내는 문자열을 반환합니다. (Object에서 상속됨)
맨 위

XML 직렬화는 개체의 공용 속성 및 필드를 저장 또는 전송을 위해 직렬 형식(이 경우 XML)으로 변환하는 프로세스입니다. 역직렬화는 XML 출력에서 개체를 원래 상태로 다시 만드는 프로세스입니다. 직렬화는 개체의 상태를 스트림 또는 버퍼에 저장하는 방식 중 하나라고 할 수 있습니다.

개체 내의 데이터는 클래스, 필드, 속성, 기본 형식, 배열 및 포함된 XML과 같은 프로그래밍 언어 구조를 통하여 설명됩니다.

개체와 XML 간의 데이터 전송을 위해서는 프로그래밍 언어 구문에서 XML 스키마로의 매핑 및 그 반대로의 매핑도 필요합니다. XmlSerializer는 디자인 타임 및 런타임에 이러한 두 기술을 적절히 연결해 주는 기능을 합니다.

생성된 XML 제어

클래스 및 멤버에 특수한 특성을 적용하면 생성된 XML을 제어할 수 있습니다. 예를 들어, 다른 XML 요소 이름을 지정하려면 공용 필드나 속성에 XmlElementAttribute를 적용하고 ElementName 속성을 설정합니다. IXmlSerializable 인터페이스를 구현하여 XML 출력을 제어할 수도 있습니다.

생성된 XML이 World Wide Web 컨소시엄(www.w3.org) 문서의 5단원, "SOAP(Simple Object Access Protocol) 1.1"을 따르도록 하려면 XmlTypeMapping으로 XmlSerializer를 구성해야 합니다.

XmlSerializer를 사용하면 강력하게 형식화된 클래스로 작업하면서 XML의 융통성을 계속 활용할 수 있습니다. 필드나 속성을 사용하면 XML 문서의 일부를 XML 개체로 직접 읽어올 수 있습니다.

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

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

public class MyClass
{
    public MyObject MyObjectProperty;
}
public class MyObject
{
    public string ObjectName;
}

직렬화된 XML은 다음 코드와 같이 출력됩니다.

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

스키마가 선택적인 요소(minOccurs = '0')를 포함하거나 기본값을 포함할 경우 특수 패턴을 사용하여 XmlSerializer에서 인식하는 부울 필드를 만든 후 해당 필드에 XmlIgnoreAttribute를 적용합니다. 이 패턴은 propertyNameSpecified 형식으로 만들어집니다. 예를 들어, "MyFirstName" 필드가 있을 경우 "MyFirstName"이라는 XML 요소를 생성할지 여부를 XmlSerializer에 지시하는 "MyFirstNameSpecified" 필드를 만들어야 합니다. 다음 예제에서 이를 확인할 수 있습니다.

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 클래스의 인스턴스에 이를 추가하여 개체 집합과 해당 필드 및 속성에 대한 직렬화를 재정의할 수도 있습니다. 이러한 방식으로 직렬화를 재정의하면 두 가지 효과를 얻을 수 있습니다. 첫째, 소스에 액세스할 수 없는 경우에도 DLL에 있는 개체의 직렬화를 제한하고 확장할 수 있으며 둘째, 직렬화할 수 있는 클래스 집합을 하나만 만들어도 개체를 직렬화할 때는 여러 방법을 사용할 수 있습니다. 자세한 내용은 XmlAttributeOverrides 클래스를 참조하세요.

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

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

참고참고:

XmlSerializer를 사용하면 IEnumerable 또는 ICollection을 구현하는 클래스를 특별히 처리할 수 있습니다. IEnumerable을 구현하는 클래스는 단일 매개 변수를 취하는 공용 Add 메서드를 구현해야 합니다. Add 메서드의 매개 변수는 GetEnumerator에서 반환된 값에 대한 Current 속성에서 반환된 형식과 같거나, 해당 기본 형식 중 하나여야 합니다. IEnumerable뿐 아니라 ICollection을 구현하는 클래스는 정수를 취하는 인덱싱된 공용 Item 속성(C#에서 인덱서)이 있어야 하며, 정수 형식의 공용 Count 속성도 있어야 합니다. Add 메서드의 매개 변수는 Item 속성에서 반환된 형식과 같거나, 해당 기본 형식 중 하나여야 합니다. ICollection을 구현하는 클래스의 경우, 직렬화되는 값은 GetEnumerator를 호출하지 않고, 인덱싱된 Item 속성에서 검색됩니다.

개체를 역직렬화하려면 임시 디렉터리에 대한 쓰기 권한이 있어야 합니다. 이러한 권한은 TEMP 환경 변수를 통해 정의됩니다.

동적으로 생성되는 어셈블리

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

다른 생성자를 사용하면 동일한 어셈블리의 여러 버전이 생성되어 언로드되지 않으므로 메모리 누수가 발생하고 성능이 떨어집니다. 앞에서 언급한 두 생성자 중 하나를 사용하는 것이 가장 간단한 솔루션입니다.

ArrayList 및 제네릭 목록의 직렬화

XmlSerializer는 다음을 직렬화 또는 역직렬화할 수 없습니다.

부호 없는 정수(Long)의 열거형 직렬화

XmlSerializer는 열거형이 부호 없는 정수(Long)(C#의 경우 ulong) 형식이고 열거형에 9,223,372,036,854,775,807보다 큰 값을 가진 멤버가 있는 경우 인스턴스화하여 열거형을 직렬화할 수 없습니다. 예를 들어 다음은 직렬화할 수 없습니다.

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

Obsolete 특성으로 표시된 개체는 더 이상 직렬화되지 않음

이제 .NET Framework 3.5에서 XmlSerializer 클래스는 [Obsolete]로 표시된 개체를 직렬화하지 않습니다.

버전 메모

Windows Phone

 XElement 형식의 개체에서 XML 직렬화를 사용하면 여분의 XElement 태그가 XML 콘텐츠의 시작과 끝에 추가됩니다.

Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

이 형식은 스레드로부터 안전합니다.

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft