XML Serialization 소개Introducing XML Serialization

serialization은 개체를 전송할 수 있는 형태로 변환하는 프로세스입니다.Serialization is the process of converting an object into a form that can be readily transported. 예를 들어 개체를 serialize하고 클라이언트와 서버 사이에 HTTP를 사용하여 인터넷을 통해 전송할 수 있습니다.For example, you can serialize an object and transport it over the Internet using HTTP between a client and a server. 반면 deserialization은 스트림에서 개체를 다시 생성합니다.On the other end, deserialization reconstructs the object from the stream.

XML serialization은 개체의 public 필드와 속성 값만 XML 스트림으로 serialize합니다.XML serialization serializes only the public fields and property values of an object into an XML stream. XML serialization에는 형식 정보가 포함되지 않습니다.XML serialization does not include type information. 예를 들어 Library 네임스페이스에 존재하는 Book 개체가 있는 경우에는 같은 형식의 개체로 deserialize된다는 보장이 없습니다.For example, if you have a Book object that exists in the Library namespace, there is no guarantee that it is deserialized into an object of the same type.

참고

XML serialization은 메서드, 인덱서, 전용 필드 또는 읽기 전용 속성을 변환하지 않습니다. 단, 읽기 전용 컬렉션은 예외입니다.XML serialization does not convert methods, indexers, private fields, or read-only properties (except read-only collections). 공용 및 전용을 모두 포함하여 개체의 필드 및 속성을 모두 serialize하려면 XML serialization 대신 DataContractSerializer를 사용하십시오.To serialize all an object's fields and properties, both public and private, use the DataContractSerializer instead of XML serialization.

XML serialization의 핵심 클래스는 XmlSerializer 클래스이며 이 클래스에서 가장 중요한 메서드는 직렬화Deserialize 메서드입니다.The central class in XML serialization is the XmlSerializer class, and the most important methods in this class are the Serialize and Deserialize methods. XmlSerializer는 C# 파일을 만들고 이를 .dll 파일로 컴파일하여 이 serialization을 수행합니다.The XmlSerializer creates C# files and compiles them into .dll files to perform this serialization. .NET Framework 2.0에서 XML 직렬 변환기 생성기 도구(Sgen.exe)는 애플리케이션과 함께 배포하기 전에 이러한 serialization 어셈블리를 생성하고 시작 성능을 향상시키도록 디자인되었습니다.In .NET Framework 2.0, the XML Serializer Generator Tool (Sgen.exe) is designed to generate these serialization assemblies in advance to be deployed with your application and improve startup performance. 생성 된 XML 스트림을 합니다 XmlSerializer World Wide Web Consortium (W3C)를 사용 하 여 규격이 XML 스키마 정의 언어 (XSD) 1.0 권장 사항합니다.The XML stream generated by the XmlSerializer is compliant with the World Wide Web Consortium (W3C) XML Schema definition language (XSD) 1.0 recommendation. 또한는 생성 된 데이터 형식은 호환 문서를 사용 하 여 "XML Schema Part 2: Datatypes입니다. "Furthermore, the data types generated are compliant with the document titled "XML Schema Part 2: Datatypes."

개체 내의 데이터는 클래스, 필드, 속성, 기본 형식, 배열 및 XmlElement 또는 XmlAttribute 개체 형태로 포함된 XML과 같은 프로그래밍 언어 구조를 통하여 설명됩니다.The data in your objects is described using programming language constructs like classes, fields, properties, primitive types, arrays, and even embedded XML in the form of XmlElement or XmlAttribute objects. 특성으로 주석이 첨부된 클래스를 직접 만들거나, XML 스키마 정의 도구를 사용하여 기존 XML 스키마를 기반으로 클래스를 생성할 수도 있습니다.You have the option of creating your own classes, annotated with attributes, or using the XML Schema Definition tool to generate the classes based on an existing XML Schema.

XML 스키마가 있는 경우, XML 스키마 정의 도구를 실행하여 스키마로 강력하게 형식화되고 주석이 첨부된 클래스 집합을 생성할 수 있습니다.If you have an XML Schema, you can run the XML Schema Definition tool to produce a set of classes that are strongly typed to the schema and annotated with attributes. 이러한 클래스의 인스턴스가 serialize될 때 생성된 XML은 XML 스키마를 준수합니다.When an instance of such a class is serialized, the generated XML adheres to the XML Schema. 이러한 클래스를 사용하면 생성된 XML이 XML 스키마를 준수하도록 하면서 손쉽게 조작할 수 있는 개체 모델을 사용하여 프로그래밍할 수 있습니다.Provided with such a class, you can program against an easily manipulated object model while being assured that the generated XML conforms to the XML schema. 이 방법은 XmlReaderXmlWriter 클래스와 같은 .NET Framework의 다른 클래스를 사용하여 XML 스트림을 구문 분석하고 쓰는 대신 사용할 수 있습니다.This is an alternative to using other classes in the .NET Framework, such as the XmlReader and XmlWriter classes, to parse and write an XML stream. 자세한 내용은 XML 문서 및 데이터를 참조하세요.For more information, see XML Documents and Data. 이러한 클래스를 사용하면 모든 XML 스트림을 구문 분석할 수 있습니다.These classes allow you to parse any XML stream. 반면 XML 스트림이 알려진 XML 스키마를 준수해야 하는 경우에는 XmlSerializer를 사용합니다.In contrast, use the XmlSerializer when the XML stream is expected to conform to a known XML Schema.

특성은 XmlSerializer 클래스로 생성된 XML 스트림을 제어하기 때문에 XML 스트림의 XML 네임스페이스, 요소 이름, 특성 이름 등을 설정할 수 있습니다.Attributes control the XML stream generated by the XmlSerializer class, allowing you to set the XML namespace, element name, attribute name, and so on, of the XML stream. 이러한 특성에 대한 자세한 내용 및 이러한 특성이 XML serialization을 제어하는 방법에 대해서는 특성을 사용하여 XML Serialization 제어를 참조하세요.For more information about these attributes and how they control XML serialization, see Controlling XML Serialization Using Attributes. 생성된 XML의 제어에 사용되는 특성의 표를 보려면 XML Serialization을 제어하는 특성을 참조하세요.For a table of those attributes that are used to control the generated XML, see Attributes That Control XML Serialization.

XmlSerializer 클래스는 개체를 추가적으로 직렬화하여 인코딩된 SOAP XML 스트림을 생성할 수 있습니다.The XmlSerializer class can further serialize an object and generate an encoded SOAP XML stream. 생성된 XML은 World Wide Web 컨소시엄 문서 "SOAP(Simple Object Access Protocol) 1.1"의 5단원을 따릅니다.The generated XML adheres to section 5 of the World Wide Web Consortium document titled "Simple Object Access Protocol (SOAP) 1.1." 이 프로세스에 대 한 자세한 내용은 참조 하세요. 방법: SOAP 인코딩된 XML Stream 개체 직렬화합니다.For more information about this process, see How to: Serialize an Object as a SOAP-Encoded XML Stream. 생성된 XML을 제어하는 특성의 표를 보려면 인코딩된 SOAP Serialization을 제어하는 특성을 참조하세요.For a table of the attributes that control the generated XML, see Attributes That Control Encoded SOAP Serialization.

XmlSerializer 클래스는 XML Web services에 의해 생성되고 XML Web services로 전달되는 SOAP 메시지를 생성합니다.The XmlSerializer class generates the SOAP messages created by, and passed to, XML Web services. SOAP 메시지를 제어하려면 XML Web services 파일(.asmx)의 클래스, 반환 값, 매개 변수 및 필드에 특성을 적용할 수 있습니다.To control the SOAP messages, you can apply attributes to the classes, return values, parameters, and fields found in an XML Web service file (.asmx). XML Web services는 리터럴 또는 인코딩된 SOAP 스타일을 사용할 수 있으므로 "XML serialization을 제어하는 특성" 및 "인코딩된 SOAP serialization을 제어하는 특성"에 나열된 두 특성을 모두 사용할 수 있습니다.You can use both the attributes listed in "Attributes That Control XML Serialization" and "Attributes That Control Encoded SOAP Serialization" because an XML Web service can use either the literal or encoded SOAP style. 특성을 사용하여 XML Web services에서 생성된 XML을 제어하는 방법에 대한 자세한 내용은 XML Web Services의 XML Serialization을 참조하세요.For more information about using attributes to control the XML generated by an XML Web service, see XML Serialization with XML Web Services. SOAP 및 XML Web services에 대 한 자세한 내용은 참조 하세요. SOAP 메시지 형식을 사용자 지정합니다.For more information about SOAP and XML Web services, see Customizing SOAP Message Formatting.

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

XmlSerializer를 사용하는 응용 프로그램을 만들 때 다음과 같은 항목 및 해당 구현에 대해 알고 있어야 합니다.When creating an application that uses the XmlSerializer, you should be aware of the following items and their implications:

  • XmlSerializer는 C# 파일(.cs)을 만들어서 TEMP 환경 변수에 의해 이름 지정된 디렉터리의 .dll 파일로 컴파일합니다. 이 DLL을 사용하여 serialization이 수행됩니다.The XmlSerializer creates C# (.cs) files and compiles them into .dll files in the directory named by the TEMP environment variable; serialization occurs with those DLLs.

    참고

    이러한 serialization 어셈블리는 SGen.exe 도구를 사용하여 미리 생성하고 서명할 수 있습니다.These serialization assemblies can be generated in advance and signed by using the SGen.exe tool. 웹 서비스의 서버에는 작동하지 않습니다.This does not work a server of Web services. 즉, 클라이언트 및 수동 serialization 전용입니다.In other words, it is only for client use and for manual serialization.

    코드 및 DLL은 생성 및 컴파일 시점에서 악의적 프로세스에 취약합니다.The code and the DLLs are vulnerable to a malicious process at the time of creation and compilation. Microsoft Windows NT 4.0 이상을 실행하는 컴퓨터에서 사용할 때는 둘 이상의 사용자가 TEMP 디렉터리를 공유할 수 있습니다.When using a computer running Microsoft Windows NT 4.0 or later, it might be possible for two or more users to share the TEMP directory. 두 계정의 보안 권한이 서로 다르고 높은 권한의 계정이 XmlSerializer를 사용하여 애플리케이션을 실행하는 경우 TEMP 디렉터리를 공유하는 것이 위험합니다.Sharing a TEMP directory is dangerous if the two accounts have different security privileges and the higher-privilege account runs an application using the XmlSerializer. 이 경우 한 사용자가 컴파일된 .cs 또는 .dll 파일을 바꿔 컴퓨터의 보안을 침해할 수 있습니다.In this case, one user can breach the computer's security by replacing either the .cs or .dll file that is compiled. 이런 문제를 방지하기 위해 항상 컴퓨터의 각 계정마다 자체 프로필을 사용하도록 하십시오.To eliminate this concern, always be sure that each account on the computer has its own profile. 기본적으로 TEMP 환경 변수는 각 계정마다 서로 다른 디렉터리를 가리킵니다.By default, the TEMP environment variable points to a different directory for each account.

  • 악의적 사용자가 XML 데이터의 연속 스트림을 웹 서버에 전송하면(서비스 거부 공격) XmlSerializer는 컴퓨터 리소스가 부족해질 때까지 데이터를 계속 처리합니다.If a malicious user sends a continuous stream of XML data to a Web server (a denial of service attack), then the XmlSerializer continues to process the data until the computer runs low on resources.

    IIS(인터넷 정보 서비스)를 실행하는 컴퓨터를 사용하여 애플리케이션이 IIS 내에서 실행되는 경우에는 이러한 종류의 공격이 제거됩니다.This kind of attack is eliminated if you are using a computer running Internet Information Services (IIS), and your application is running within IIS. IIS에는 설정된 길이(기본값은 4KB)보다 긴 스트림은 처리하지 않는 기능이 있습니다.IIS features a gate that does not process streams longer than a set amount (the default is 4 KB). IIS를 사용하지 않는 애플리케이션을 만들고 XmlSerializer로 deserialize하는 경우에는 서비스 거부 공격을 차단하는 이와 비슷한 기능을 구현해야 합니다.If you create an application that does not use IIS and deserializes with the XmlSerializer, you should implement a similar gate that prevents a denial of service attack.

  • XmlSerializer에서는 데이터를 직렬화하고 주어진 모든 형식을 사용하여 코드를 실행합니다.The XmlSerializer serializes data and runs any code using any type given to it.

    악의적 개체가 위협을 초래하는 방법에는 두 가지가 있습니다.There are two ways in which a malicious object presents a threat. 즉, 악의적 코드를 실행하거나 XmlSerializer에서 만들어진 C# 파일에 악의적 코드를 삽입할 수 있습니다.It could run malicious code or it could inject malicious code into the C# file created by the XmlSerializer. 첫 번째 경우 악의적 개체가 안전하지 않은 절차의 실행을 시도하면 코드 액세스 보안이 이러한 행위로 인한 손상 예방에 도움을 줍니다.In the first case, if a malicious object tries to run a destructive procedure, code access security helps prevent any damage from being done. 두 번째 경우 이론적으로는 악의적 개체가 XmlSerializer에서 만들어진 C# 파일에 코드를 삽입할 수 있는 가능성이 있습니다.In the second case, there is a theoretical possibility that a malicious object may somehow inject code into the C# file created by the XmlSerializer. 이 문제는 철저하게 검사되었고 이러한 공격이 수행될 가능성도 거의 없지만 알려지지 않은 형식과 신뢰할 수 없는 형식으로 데이터를 serialize하지 않아야 합니다.Although this issue has been examined thoroughly, and such an attack is considered unlikely, you should take the precaution of never serializing data with an unknown and untrusted type.

  • serialize된 중요한 데이터가 취약할 수 있습니다.Serialized sensitive data might be vulnerable.

    후 합니다 XmlSerializer 데이터를 serialize XML 파일이 나 다른 데이터 저장소를 저장할 수 있습니다.After the XmlSerializer has serialized data, it can be stored as an XML file or other data store. 데이터 저장소를 다른 프로세스가 사용할 수 있거나 인트라넷 또는 인터넷에서 볼 수 있는 경우에는 데이터가 도난당하여 해로운 목적으로 사용될 수 있습니다.If your data store is available to other processes, or is visible on an intranet or the Internet, the data can be stolen and used maliciously. 예를 들어 신용카드 번호가 포함된 주문을 serialize하는 애플리케이션을 만드는 경우에는 데이터가 매우 중요합니다.For example, if you create an application that serializes orders that include credit card numbers, the data is highly sensitive. 이런 문제를 방지하기 위해 항상 데이터 저장소를 보호하고 공개되지 않도록 조치를 취해야 합니다.To help prevent this, always protect the store for your data and take steps to keep it private.

간단한 클래스의 serializationSerialization of a Simple Class

다음 코드 예제에서는 public 필드가 있는 기본 클래스를 보여 줍니다.The following code example shows a basic class with a public field.

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

이 클래스의 인스턴스를 serialize하면 다음과 같을 수 있습니다.When an instance of this class is serialized, it might resemble the following.

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

Serialization에 대한 다른 예제를 보려면 XML Serialization 예제를 참조하세요.For more examples of serialization, see Examples of XML Serialization.

serialize할 수 있는 항목Items That Can Be Serialized

XmLSerializer 클래스를 사용하여 직렬화할 수 있는 항목은 다음과 같습니다.The following items can be serialized using the XmLSerializer class:

  • 공용 클래스의 공용 읽기/쓰기 속성 및 필드Public read/write properties and fields of public classes.

  • ICollection 또는 IEnumerable을 구현하는 클래스Classes that implement ICollection or IEnumerable.

    참고

    public 속성이 아니라 컬렉션만 serialize됩니다.Only collections are serialized, not public properties.

  • XmlElement 개체XmlElement objects.

  • XmlNode 개체XmlNode objects.

  • DataSet 개체DataSet objects.

직렬화 또는 개체를 역직렬화 하는 방법에 대 한 자세한 내용은 참조 하세요. 방법: 개체를 직렬화방법: 개체를 deserialize합니다.For more information about serializing or deserializing objects, see How to: Serialize an Object and How to: Deserialize an Object.

XML serialization 사용의 장점Advantages of Using XML Serialization

합니다 XmlSerializer 클래스를 사용 하면 완료 하 고 융통성 있는 제어 개체를 XML로 serialize 할 때입니다.The XmlSerializer class gives you complete and flexible control when you serialize an object as XML. XML Web services를 만드는 경우 XML 출력이 특정 스키마를 따르도록 serialization을 제어하는 특성을 클래스와 멤버에 적용할 수 있습니다.If you are creating an XML Web service, you can apply attributes that control serialization to classes and members to ensure that the XML output conforms to a specific schema.

예를 들어 XmlSerializer를 사용하여 다음을 수행할 수 있습니다.For example, XmlSerializer enables you to:

  • 필드 또는 속성을 특성 또는 요소로 인코딩할 것인지 여부를 지정합니다.Specify whether a field or property should be encoded as an attribute or an element.

  • 사용할 XML 네임스페이스를 지정합니다.Specify an XML namespace to use.

  • 필드 또는 속성 이름이 부적절한 경우 요소 또는 특성의 이름을 지정합니다.Specify the name of an element or attribute if a field or property name is inappropriate.

XML serialization의 다른 장점은 생성되는 XML 스트림이 지정된 스키마를 따르기만 하면 개발하는 애플리케이션에 대한 제약 조건이 없다는 점입니다.Another advantage of XML serialization is that you have no constraints on the applications you develop, as long as the XML stream that is generated conforms to a given schema. 책을 설명하는 데 사용되는 스키마를 예로 들어보겠습니다.Imagine a schema that is used to describe books. 이 경우 제목, 저자, 출판사 및 ISBN 번호 요소가 사용됩니다.It features a title, author, publisher, and ISBN number element. XML 데이터를 책 주문 또는 책 재고 관리 등과 같은 원하는 방식으로 처리하는 애플리케이션을 개발할 수 있습니다.You can develop an application that processes the XML data in any way you want, for example, as a book order, or as an inventory of books. 두 경우 모두 유일한 요구 사항은 XML 스트림이 지정된 XSD(XML 스키마 정의 언어) 스키마를 준수해야 한다는 점입니다.In either case, the only requirement is that the XML stream conforms to the specified XML Schema definition language (XSD) schema.

XML serialization 고려 사항XML Serialization Considerations

다음은 XmlSerializer 클래스를 사용할 때 고려해야 할 사항입니다.The following should be considered when using the XmlSerializer class:

  • Sgen.exe 도구는 최적의 성능을 위해 serialization 어셈블리를 생성하도록 디자인되었습니다.The Sgen.exe tool is expressly designed to generate serialization assemblies for optimum performance.

  • serialize된 데이터에는 데이터 자체와 클래스의 구조만 포함됩니다.The serialized data contains only the data itself and the structure of your classes. 형식 ID와 어셈블리 정보는 포함되지 않습니다.Type identity and assembly information are not included.

  • public 속성 및 필드만 serialize될 수 있습니다.Only public properties and fields can be serialized. 속성에는 public 접근자(get 및 set 메서드)가 있어야 합니다.Properties must have public accessors (get and set methods). 공용이 아닌 데이터를 serialize해야 하는 경우에는 XML serialization이 아닌 DataContractSerializer 클래스를 사용하십시오.If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.

  • 클래스를 serialize 할 수 매개 변수가 없는 생성자가 있어야 XmlSerializer합니다.A class must have a parameterless constructor to be serialized by XmlSerializer.

  • 메서드는 serialize될 수 없습니다.Methods cannot be serialized.

  • XmlSerializer는 다음과 같이 특정 요구 사항을 충족하는 경우 IEnumerable 또는 ICollection을 서로 다르게 구현하는 클래스를 처리할 수 있습니다.XmlSerializer can process classes that implement IEnumerable or ICollection differently if they meet certain requirements, as follows.

    IEnumerable을 구현하는 클래스는 단일 매개 변수를 사용하는 공용 Add 메서드를 구현해야 합니다.A class that implements IEnumerable must implement a public Add method that takes a single parameter. Add 메서드의 매개 변수는 GetEnumerator 메서드에서 반환된 IEnumerator.Current 속성에서 반환된 형식과 일관되어야 합니다(다형성).The Add method's parameter must be consistent (polymorphic) with the type returned from the IEnumerator.Current property returned from the GetEnumerator method.

    IEnumerable(예: CollectionBase) 이외에 ICollection을 구현하는 클래스에는 정수를 받는 공용 Item이 인덱싱된 속성(C#에서는 인덱서)이 있어야 하며 integer 형식의 공용 Count 속성이 있어야 합니다.A class that implements ICollection in addition to IEnumerable (such as CollectionBase) must have a public Item indexed property (an indexer in C#) that takes an integer and it must have a public Count property of type integer. Add 메서드로 전달되는 매개 변수는 Item 속성에서 반환된 형식과 같거나, 해당 기본 형식 중 하나여야 합니다.The parameter passed to the Add method must be the same type as that returned from the Item property, or one of that type's bases.

    ICollection을 구현하는 클래스의 경우, 직렬화되는 값은 GetEnumerator를 호출하는 대신 인덱싱된 Item 속성에서 검색됩니다.For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property rather than by calling GetEnumerator. 또한 다른 컬렉션 클래스(ICollection을 구현하는 클래스)를 반환하는 public 필드를 제외하고 public 필드와 속성은 직렬화되지 않습니다.Also, public fields and properties are not serialized, with the exception of public fields that return another collection class (one that implements ICollection). 예제를 보려면 XML Serialization 예제를 참조하세요.For an example, see Examples of XML Serialization.

XSD 데이터 형식 매핑XSD Data Type Mapping

W3C 문서 XML Schema Part 2: Datatypes XML 스키마 정의 언어 (XSD) 스키마에서 허용 되는 간단한 데이터 형식을 지정 합니다.The W3C document titled XML Schema Part 2: Datatypes specifies the simple data types that are allowed in an XML Schema definition language (XSD) schema. 이러한 형식(예: intdecimal)은 대부분 .NET Framework에 해당 데이터 형식이 있습니다.For many of these (for example, int and decimal), there is a corresponding data type in the .NET Framework. 하지만 일부 XML 데이터 형식에는 .NET Framework에 해당 데이터 형식이 없습니다(예: NMTOKEN 데이터 형식).However, some XML data types do not have a corresponding data type in the .NET Framework (for example, the NMTOKEN data type). 이러한 경우 XML 스키마 정의 도구(Xsd.exe)를 사용하여 스키마에서 클래스를 생성하면 문자열 형식의 멤버에 적절한 특성이 적용되며 해당 DataType 속성이 XML 데이터 형식 이름으로 설정됩니다.In such cases, if you use the XML Schema Definition tool (XML Schema Definition Tool (Xsd.exe)) to generate classes from a schema, an appropriate attribute is applied to a member of type string, and its DataType property is set to the XML data type name. 예를 들어 스키마에 XML 데이터 형식 NMTOKEN의 “MyToken” 요소가 포함된 경우, 다음 예제처럼 생성되는 클래스에 멤버가 포함될 수 있습니다.For example, if a schema contains an element named "MyToken" with the XML data type NMTOKEN, the generated class might contain a member as shown in the following example.

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

마찬가지로 특정 XML 스키마(XSD)를 준수해야 하는 클래스를 만드는 경우 적절한 특성을 적용하고 해당 DataType 속성을 원하는 XML 데이터 형식 이름으로 설정해야 합니다.Similarly, if you are creating a class that must conform to a specific XML Schema (XSD), you should apply the appropriate attribute and set its DataType property to the desired XML data type name.

형식 매핑의 전체 목록에 대해서는 다음 특성 클래스에 대한 DataType 속성을 참조하세요.For a complete list of type mappings, see the DataType property for any of the following attribute classes:

참고자료See also