Введение в сериализацию XMLIntroducing XML Serialization

Сериализация представляет собой процесс преобразования объекта в форму, подготовленную для передачи.Serialization is the process of converting an object into a form that can be readily transported. Например, можно сериализовать объект и передать его по Интернету с использованием протокола HTTP между клиентом и сервером.For example, you can serialize an object and transport it over the Internet using HTTP between a client and a server. И наоборот, при десериализации объект воссоздается из потока.On the other end, deserialization reconstructs the object from the stream.

При XML-сериализации в поток XML сериализуются только открытые поля и значения свойств объекта.XML serialization serializes only the public fields and property values of an object into an XML stream. XML-сериализация не учитывает информацию о типе.XML serialization does not include type information. Например, если имеется объект Book, который существует в пространстве имен Library, нет никакой гарантии, что он десериализуется в объект аналогичного типа.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-сериализация не выполняет преобразование методов, индексаторов, закрытых полей или свойств только для чтения (кроме коллекций только для чтения).XML serialization does not convert methods, indexers, private fields, or read-only properties (except read-only collections). Для сериализации всех полей и свойств объекта, как открытых, так и закрытых, используйте DataContractSerializer вместо XML-сериализации.To serialize all an object's fields and properties, both public and private, use the DataContractSerializer instead of XML serialization.

Центральным классом XML-сериализации является класс XmlSerializer, а наиболее важные методы в этом классе — Serialize и 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 для выполнения сериализации.The XmlSerializer creates C# files and compiles them into .dll files to perform this serialization. В платформе .NET Framework 2.0 инструмент создания XML-сериализатора (Sgen.exe) предназначен для создания таких сборок сериализации заранее, они будут развертываться вместе с приложением и повышать производительность при запуске.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: Типы данных.»Furthermore, the data types generated are compliant with the document titled "XML Schema Part 2: Datatypes."

Данные в объектах описываются с помощью конструкций языка программирования, например классов, полей, свойств, типов примитивов, массивов и даже встроенного XML в форме объектов XmlElement или XmlAttribute.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. При сериализации экземпляра такого класса созданный 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. Это альтернативный вариант использования других классов в платформе .NET Framework, например классов XmlReader и XmlWriter, для анализа и записи в поток 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. И наоборот, используйте XmlSerializer, когда предполагается, что поток XML соответствует известной схеме XML.In contrast, use the XmlSerializer when the XML stream is expected to conform to a known XML Schema.

Атрибуты управляют потоком XML, который создан классом XmlSerializer, позволяя задавать пространство имен 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-сериализацией, см. в разделе Управление сериализацией XML с использованием атрибутов.For more information about these attributes and how they control XML serialization, see Controlling XML Serialization Using Attributes. Таблица атрибутов, используемых для управления созданным XML, представлена в разделе Атрибуты управления сериализацией XML.For a table of those attributes that are used to control the generated XML, see Attributes That Control XML Serialization.

Класс XmlSerializer может продолжать сериализовывать объект и создавать поток XML с кодировкой SOAP.The XmlSerializer class can further serialize an object and generate an encoded SOAP XML stream. Созданный XML соответствует требованиям раздела 5 документа консорциума World Wide Web "Simple Object Access Protocol (SOAP) 1.1".The generated XML adheres to section 5 of the World Wide Web Consortium document titled "Simple Object Access Protocol (SOAP) 1.1." Дополнительные сведения об этом процессе см. в разделе как: Сериализация объекта как XML с кодировкой SOAP Stream.For more information about this process, see How to: Serialize an Object as a SOAP-Encoded XML Stream. Таблица атрибутов, используемых для управления созданным XML, представлена в разделе Атрибуты управления сериализацией с кодировкой SOAP.For a table of the attributes that control the generated XML, see Attributes That Control Encoded SOAP Serialization.

Класс XmlSerializer создает сообщения SOAP, созданные и переданные в XML-веб-службы.The XmlSerializer class generates the SOAP messages created by, and passed to, XML Web services. Для управления сообщениями SOAP можно применять атрибуты к классам, возвращаемым значениям, параметрам и полям, обнаруженным в файле XML-веб-службы (файл 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-сериализацией" и "Атрибуты управления сериализацией с кодировкой SOAP", поскольку XML-веб-служба использует либо литеральный стиль, либо стиль с кодировкой SOAP.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, созданным XML-веб-службой, см. в разделе Сериализация XML с использованием XML-веб-служб.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-веб-службы, см. в разделе Настройка форматирования сообщения SOAP.For more information about SOAP and XML Web services, see Customizing SOAP Message Formatting.

Вопросы безопасности в отношении приложений с XmlSerializerSecurity 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) и компилирует их в файлы DLL в каталоге, названном переменной среды TEMP. С помощью этих файлов DLL выполняется сериализация.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.

    Примечание

    Такие сборки сериализации можно создавать заранее и подписать с помощью инструмента 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. Другими словами, этот способ используется только для клиентов и сериализации вручную.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. Совместный доступ к каталогу TEMP представляет угрозу, если у двух учетных записей разные привилегии безопасности и приложение запускается из учетной записи с более высокими привилегиями с использованием XmlSerializer.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.

    Такой вид атаки блокируется, если используется компьютер с запущенными службами Internet Information Services (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 используется логический элемент, который не обрабатывает потоки, размер которых больше заданного значения (по умолчанию 4 КБ).IIS features a gate that does not process streams longer than a set amount (the default is 4 KB). Если создается приложение, не использующее службы IIS и выполняющее сериализацию с помощью XmlSerializer, необходимо реализовать похожий логический элемент, который будет блокировать атаки типа "отказ в обслуживании".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. Он может запустить вредоносный код или ввести его в файл C#, созданный XmlSerializer.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. Во втором случае теоретически существует вероятность того, что вредоносный объект может каким-либо способом ввести код в файл C#, созданный XmlSerializer.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. Несмотря на то что эта проблема была тщательно изучена и вероятность такой атаки минимальна, следует принять меры предосторожности, т. е. никогда не сериализовывать данные неизвестного и недоверенного типа.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.

  • Сериализованные конфиденциальные данные могут быть уязвимы.Serialized sensitive data might be vulnerable.

    После XmlSerializer сериализовал данные, их можно сохранить в 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. Например, если создается приложение, которое сериализует заказы, содержащие номера кредитных карт, такие данные очень важны.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.

Сериализация простого классаSerialization of a Simple Class

В следующем примере кода показан базовый класс с открытым полем.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;
}

При сериализации экземпляра этого класса этот процесс может выглядеть следующим образом.When an instance of this class is serialized, it might resemble the following.

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

Дополнительные примеры XML-сериализации см. в разделе Примеры сериализации XML.For more examples of serialization, see Examples of XML Serialization.

Элементы, которые можно сериализовать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.

    Примечание

    Сериализуются только коллекции, а не открытые свойства.Only collections are serialized, not public properties.

  • Объекты XmlElement.XmlElement objects.

  • Объекты XmlNode.XmlNode objects.

  • Объекты DataSet.DataSet objects.

Дополнительные сведения о сериализации и десериализации объектов см. в разделе как: Сериализация объекта и как: Десериализация объекта.For more information about serializing or deserializing objects, see How to: Serialize an Object and How to: Deserialize an Object.

Преимущества XML-сериализацииAdvantages of Using XML Serialization

XmlSerializer класс обеспечивает всестороннее и гибкое управление сериализацией объекта как XML.The XmlSerializer class gives you complete and flexible control when you serialize an object as XML. При создании XML-веб-службы к классам и членам можно применять атрибуты управления сериализацией, чтобы выходные данные XML соответствовали определенной схеме.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-сериализации является отсутствие ограничений для разрабатываемых приложений, поскольку создаваемый поток 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 указанной схеме языка определения схемы XML (XSD).In either case, the only requirement is that the XML stream conforms to the specified XML Schema definition language (XSD) schema.

Вопросы, связанные XML-сериализациейXML Serialization Considerations

При использовании класса XmlSerializer следует обратить внимание на следующие аспекты:The following should be considered when using the XmlSerializer class:

  • Инструмент Sgen.exe разработан только для создания сборок сериализации для обеспечения оптимальной производительности.The Sgen.exe tool is expressly designed to generate serialization assemblies for optimum performance.

  • Сериализованные данные содержат только сами данные и структуру классов.The serialized data contains only the data itself and the structure of your classes. Удостоверения типа и информация о сборке не сохраняются.Type identity and assembly information are not included.

  • Могут быть сериализованы только открытые свойства и поля.Only public properties and fields can be serialized. Для свойств должны быть указаны открытые методы доступа (методы get и set).Properties must have public accessors (get and set methods). Если необходимо сериализовать закрытые данные, вместо XML-сериализации используйте класс DataContractSerializer.If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.

  • Класс должен иметь конструктор без параметров, который сериализуется с помощью XmlSerializer.A class must have a parameterless constructor to be serialized by XmlSerializer.

  • Методы не могут быть сериализованы.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 должен соответствовать (быть полиморфным) типу, возвращаемому из свойства IEnumerator.Current, которое возвращается из метода GetEnumerator.The Add method's parameter must be consistent (polymorphic) with the type returned from the IEnumerator.Current property returned from the GetEnumerator method.

    Класс, реализующий ICollection в дополнение к IEnumerable (например, CollectionBase), должен иметь открытое индексированное свойство Item (индексатор в C#), которое принимает целое число, и должен иметь открытое свойство Count типа integer.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, сериализуемые значения извлекаются из индексированного свойства Item, а не путем вызова GetEnumerator.For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property rather than by calling GetEnumerator. Кроме того, открытые поля и свойства не сериализуются, за исключением открытых полей, которые возвращают другой класс коллекции (реализующий ICollection).Also, public fields and properties are not serialized, with the exception of public fields that return another collection class (one that implements ICollection). Дополнительные примеры XML-сериализации см. в разделе Примеры сериализации XML.For an example, see Examples of XML Serialization.

Сопоставление типа данных XSDXSD Data Type Mapping

В документе W3C XML Schema Part 2: Типы данных указывает простые типы данных, которые допускаются в схему языка определения схемы XML.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. Для большинства из них (например, int и decimal) существует соответствующий тип данных в платформе .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 (инструмент определения схемы 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. Например, если схема содержит элемент с именем "MyToken" с типом данных XML NMTOKEN, созданный класс может содержать член, см. пример ниже.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