다음을 통해 공유


XML 직렬화

Serialization은 개체를 쉽게 전송할 수 있는 폼으로 변환하는 프로세스입니다. 예를 들어 클라이언트와 서버 간에 HTTP를 사용하여 개체를 직렬화하고 인터넷을 통해 전송할 수 있습니다. 한편, 역직렬화는 스트림에서 객체를 재구성합니다.

XML serialization은 개체의 공용 필드 및 속성 값만 XML 스트림으로 직렬화합니다. XML serialization에는 형식 정보가 포함되지 않습니다. 예를 들어 Library 네임스페이스에 Book 개체가 있는 경우 동일한 형식의 개체로 역직렬화된다는 보장은 없습니다.

비고

XML serialization은 메서드, 인덱서, 프라이빗 필드 또는 읽기 전용 속성(읽기 전용 컬렉션 제외)을 변환하지 않습니다. 공용 및 프라이빗 개체의 모든 필드와 속성을 직렬화하려면 XML serialization 대신 사용합니다 DataContractSerializer .

XML serialization의 중심 클래스는 XmlSerializer 클래스이며, 이 클래스에서 가장 중요한 메서드는 SerializeDeserialize 메서드입니다. XmlSerializer는 C# 파일을 만들어서 .dll 파일로 컴파일하여 직렬화를 수행합니다. XML serializer 생성기 도구(Sgen.exe)는 애플리케이션과 함께 배포하기 위해 이러한 serialization 어셈블리를 미리 생성하고 시작 성능을 향상하도록 설계되었습니다. XmlSerializer에서 생성된 XML 스트림은 W3C(World Wide Web Consortium) XSD(XML 스키마 정의 언어) 1.0 권장 사항을 준수합니다. 또한 생성된 데이터 형식은 "XML 스키마 2부: 데이터 형식"이라는 문서를 준수합니다.

개체의 데이터는 클래스, 필드, 속성, 기본 형식, 배열 및 XmlElement 또는 XmlAttribute 개체 형식의 포함된 XML과 같은 프로그래밍 언어 구문을 사용하여 설명합니다. 고유한 클래스를 만들거나, 특성으로 주석을 추가하거나, XML 스키마 정의 도구를 사용하여 기존 XML 스키마를 기반으로 클래스를 생성할 수 있습니다.

XML 스키마가 있는 경우 XML 스키마 정의 도구를 실행하여 스키마에 강력하게 형식화되고 특성으로 주석이 추가된 클래스 집합을 생성할 수 있습니다. 이러한 클래스의 인스턴스가 serialize되면 생성된 XML은 XML 스키마를 준수합니다. 이러한 클래스를 사용하면 생성된 XML이 XML 스키마를 준수함을 보장하면서 쉽게 조작할 수 있는 개체 모델에 대해 프로그래밍할 수 있습니다. XmlReader 및 XmlWriter 클래스와 같은 .NET의 다른 클래스를 사용하여 XML 스트림을 구문 분석하고 작성하는 대신 사용할 수 있습니다. 자세한 내용은 XML 문서 및 데이터를 참조하세요. 이러한 클래스를 사용하면 XML 스트림을 구문 분석할 수 있습니다. 반면 XML 스트림이 알려진 XML 스키마를 준수해야 하는 경우 XmlSerializer 를 사용합니다.

특성은 XML 스트림의 XML 네임스페이스, 요소 이름, 특성 이름 등을 설정할 수 있도록 XmlSerializer 클래스에서 생성된 XML 스트림을 제어합니다. 이러한 특성 및 XML serialization을 제어하는 방법에 대한 자세한 내용은 특성을 사용하여 XML Serialization 제어를 참조하세요. 생성된 XML을 제어하는 데 사용되는 특성의 테이블은 XML Serialization을 제어하는 특성을 참조하세요.

XmlSerializer 클래스는 개체를 추가로 직렬화하고 인코딩된 SOAP XML 스트림을 생성할 수 있습니다. 생성된 XML은 "SOAP(Simple Object Access Protocol) 1.1"이라는 World Wide Web 컨소시엄 문서의 섹션 5를 준수합니다. 이 프로세스에 대한 자세한 내용은 방법: 개체를 SOAP-Encoded XML 스트림으로 serialize하는 방법을 참조하세요. 생성된 XML을 제어하는 특성의 테이블은 인코딩된 SOAP Serialization을 제어하는 특성을 참조하세요.

XmlSerializer 클래스는 XML 웹 서비스에 의해 생성되고 전달된 SOAP 메시지를 생성합니다. SOAP 메시지를 제어하려면 클래스에 특성을 적용하고 XML 웹 서비스 파일(.asmx)에 있는 값, 매개 변수 및 필드를 반환할 수 있습니다. XML 웹 서비스에서 리터럴 또는 인코딩된 SOAP 스타일을 사용할 수 있으므로 "XML Serialization을 제어하는 특성" 및 "인코딩된 SOAP Serialization을 제어하는 특성"에 나열된 특성을 모두 사용할 수 있습니다. 특성을 사용하여 XML 웹 서비스에서 생성된 XML을 제어하는 방법에 대한 자세한 내용은 XML Web Services를 사용한 XML Serialization을 참조하세요. SOAP 및 XML 웹 서비스에 대한 자세한 내용은 SOAP 메시지 서식 사용자 지정을 참조하세요.

XmlSerializer 애플리케이션에 대한 보안 고려 사항

XmlSerializer를 사용하는 애플리케이션을 만들 때는 다음 항목 및 해당 의미에 유의해야 합니다.

  • XmlSerializer는 C#(.cs) 파일을 만들고 TEMP 환경 변수로 명명된 디렉터리의 .dll 파일로 컴파일합니다. serialization은 해당 DLL에서 발생합니다.

    비고

    이러한 serialization 어셈블리는 SGen.exe 도구를 사용하여 미리 생성하고 서명할 수 있습니다. 웹 서비스 서버에서는 작동하지 않습니다. 즉, 클라이언트 사용 및 수동 직렬화에만 해당합니다.

    코드와 DLL은 생성 및 컴파일 시 악의적인 프로세스에 취약합니다. 둘 이상의 사용자가 TEMP 디렉터리를 공유할 수 있습니다. 두 계정에 서로 다른 보안 권한이 있고 더 높은 권한의 계정이 XmlSerializer를 사용하여 애플리케이션을 실행하는 경우 TEMP 디렉터리를 공유하는 것은 위험합니다. 이 경우 한 사용자가 컴파일된 .cs 또는 .dll 파일을 대체하여 컴퓨터의 보안을 위반할 수 있습니다. 이 문제를 제거하려면 항상 컴퓨터의 각 계정에 고유한 프로필이 있는지 확인합니다. 기본적으로 TEMP 환경 변수는 각 계정에 대해 다른 디렉터리를 가리킵니다.

  • 악의적인 사용자가 XML 데이터의 연속 스트림을 웹 서버(서비스 거부 공격)로 보내는 경우 XmlSerializer 는 컴퓨터가 리소스에서 부족할 때까지 데이터를 계속 처리합니다.

    IIS(인터넷 정보 서비스)를 실행하는 컴퓨터를 사용하고 애플리케이션이 IIS 내에서 실행되는 경우 이러한 종류의 공격은 제거됩니다. IIS에는 설정된 양보다 긴 스트림을 처리하지 않는 게이트가 있습니다(기본값은 4KB). IIS를 사용하지 않고 XmlSerializer를 사용하여 역직렬화하는 애플리케이션을 만드는 경우 서비스 거부 공격을 방지하는 유사한 게이트를 구현해야 합니다.

  • XmlSerializer는 데이터를 직렬화하고 지정된 형식을 사용하여 모든 코드를 실행합니다.

    악의적인 개체가 위협을 표시하는 방법에는 두 가지가 있습니다. 악성 코드를 실행하거나 XmlSerializer에서 만든 C# 파일에 악성 코드를 삽입할 수 있습니다. 두 번째 경우 악의적인 개체가 XmlSerializer에서 만든 C# 파일에 코드를 삽입할 수 있다는 이론적인 가능성이 있습니다. 이 문제는 철저히 조사되었으며 이러한 공격은 가능성이 낮다고 간주되지만 알 수 없는 신뢰할 수 없는 형식으로 데이터를 직렬화하지 않도록 주의해야 합니다.

  • 직렬화된 중요한 데이터는 취약할 수 있습니다.

    XmlSerializer가 데이터를 직렬화한 후에는 XML 파일 또는 다른 데이터 저장소로 저장할 수 있습니다. 데이터 저장소를 다른 프로세스에서 사용할 수 있거나 인트라넷 또는 인터넷에 표시되는 경우 데이터를 도난당하고 악의적으로 사용할 수 있습니다. 예를 들어 신용 카드 번호를 포함하는 주문을 직렬화하는 애플리케이션을 만드는 경우 데이터는 매우 중요합니다. 이를 방지하려면 항상 데이터에 대한 저장소를 보호하고 비공개로 유지하는 단계를 수행합니다.

단순 클래스의 직렬화

다음 코드 예제에서는 공용 필드가 있는 기본 클래스를 보여줍니다.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

이 클래스의 인스턴스가 직렬화되면 다음과 유사할 수 있습니다.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

serialization에 대한 자세한 예제는 XML Serialization 예제를 참조하세요.

Serialize할 수 있는 항목

XmlSerializer 클래스를 사용하여 다음 항목을 serialize할 수 있습니다.

  • 공용 읽기/쓰기 속성 및 공용 클래스의 필드입니다.

  • ICollection 또는 IEnumerable을 구현하는 클래스입니다.

    비고

    컬렉션만 직렬화되고 공용 속성은 serialize되지 않습니다.

  • XmlElement 개체입니다.

  • XmlNode 개체입니다.

  • DataSet 개체입니다.

개체 직렬화 또는 역직렬화에 대한 자세한 내용은 방법: 개체 직렬화방법: 개체 역직렬화를 참조하세요.

XML Serialization 사용의 이점

XmlSerializer 클래스는 개체를 XML로 직렬화할 때 완전하고 유연한 제어를 제공합니다. XML 웹 서비스를 만드는 경우 직렬화를 제어하는 특성을 클래스 및 멤버에 적용하여 XML 출력이 특정 스키마를 준수하도록 할 수 있습니다.

예를 들어 XmlSerializer 를 사용하면 다음을 수행할 수 있습니다.

  • 필드 또는 속성을 특성 또는 요소로 인코딩할지 여부를 지정합니다.

  • 사용할 XML 네임스페이스를 지정합니다.

  • 필드 또는 속성 이름이 부적절한 경우 요소 또는 특성의 이름을 지정합니다.

XML serialization의 또 다른 이점은 생성된 XML 스트림이 지정된 스키마를 준수하는 한 개발하는 애플리케이션에 제약 조건이 없다는 것입니다. 책을 설명하는 데 사용되는 스키마를 상상해 보세요. 제목, 작성자, 게시자 및 ISBN 번호 요소가 있습니다. XML 데이터를 원하는 방식으로 처리하는 애플리케이션(예: 책 순서 또는 책 인벤토리)을 개발할 수 있습니다. 두 경우 모두 XML 스트림이 지정된 XSD(XML 스키마 정의 언어) 스키마를 준수하는 것이 유일한 요구 사항입니다.

XML Serialization 고려 사항

XmlSerializer 클래스를 사용하는 경우 다음 사항을 고려해야 합니다.

  • Sgen.exe 도구는 최적의 성능을 위해 직렬화 어셈블리를 생성하도록 명시적으로 설계되었습니다.

  • 직렬화된 데이터에는 데이터 자체와 클래스의 구조만 포함됩니다. 형식 ID 및 어셈블리 정보는 포함되지 않습니다.

  • public 속성 및 필드만 직렬화할 수 있습니다. 속성에는 public 접근자(get 및 set 메서드)가 있어야 합니다. 공용이 아닌 데이터를 직렬화해야 하는 경우 XML serialization 대신 클래스를 DataContractSerializer 사용합니다.

  • XmlSerializer에서 serialize할 매개 변수가 없는 생성자가 클래스에 있어야 합니다.

  • 메서드를 serialize할 수 없습니다.

  • XmlSerializer 는 다음과 같이 특정 요구 사항을 충족하는 경우 IEnumerable 또는 ICollection 을 다르게 구현하는 클래스를 처리할 수 있습니다.

    IEnumerable을 구현하는 클래스는 단일 매개 변수를 사용하는 public Add 메서드를 구현해야 합니다. Add 메서드의 매개 변수는 GetEnumerator 메서드에서 반환된 IEnumerator.Current 속성에서 반환된 형식과 일치해야 합니다(다형).

    IEnumerable(예: CollectionBase) 외에도 ICollection을 구현하는 클래스에는 정수를 사용하는 public Item 인덱싱된 속성(C#의 인덱서)이 있어야 하며 형식 수의 public Count 속성이 있어야 합니다. Add 메서드에 전달된 매개 변수는 Item 속성 또는 해당 형식의 베이스 중 하나에서 반환된 형식과 동일해야 합니다.

    ICollection을 구현하는 클래스의 경우 직렬화할 값은 GetEnumerator를 호출하는 대신 인덱싱된 Item 속성에서 검색됩니다. 또한 다른 컬렉션 클래스( ICollection을 구현하는 컬렉션 클래스)를 반환하는 공용 필드를 제외하고 공용 필드와 속성은 직렬화되지 않습니다. 예제는 XML Serialization 예제를 참조하세요.

XSD 데이터 형식 매핑

XML 스키마 2부: 데이터 형식이라는 W3C 문서는 XSD(XML 스키마 정의 언어) 스키마에서 허용되는 간단한 데이터 형식을 지정합니다. 이러한 많은 데이터 형식(예: intdecimal)의 경우 .NET에 해당 데이터 형식이 있습니다. 그러나 일부 XML 데이터 형식에는 해당 .NET 데이터 형식(예: NMTOKEN 데이터 형식)이 없습니다. 이러한 경우 XML 스키마 정의 도구(XML 스키마 정의 도구(Xsd.exe))를 사용하여 스키마에서 클래스를 생성하는 경우 적절한 특성이 문자열 형식의 멤버에 적용되고 해당 DataType 속성이 XML 데이터 형식 이름으로 설정됩니다. 예를 들어 스키마에 XML 데이터 형식 NMTOKEN이 있는 "MyToken"이라는 요소가 포함된 경우 생성된 클래스는 다음 예제와 같이 멤버를 포함할 수 있습니다.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

마찬가지로 특정 XSD(XML 스키마)를 준수해야 하는 클래스를 만드는 경우 적절한 특성을 적용하고 해당 DataType 속성을 원하는 XML 데이터 형식 이름으로 설정해야 합니다.

형식 매핑의 전체 목록은 다음 특성 클래스에 대한 DataType 속성을 참조하세요.

참고하십시오