Сериализация (C#)Serialization (C#)

Сериализация — это процесс преобразования объекта в поток байтов для сохранения или передачи в память, базу данных или файл.Serialization is the process of converting an object into a stream of bytes to store the object or transmit it to memory, a database, or a file. Эта операция предназначена для того, чтобы сохранить состояния объекта для последующего воссоздания при необходимости.Its main purpose is to save the state of an object in order to be able to recreate it when needed. Обратный процесс называется десериализацией.The reverse process is called deserialization.

Как работает сериализацияHow serialization works

На этом рисунке показан общий процесс сериализации.This illustration shows the overall process of serialization:

График сериализации

Объект сериализуется в поток, который содержит не только данные, но и сведения о типе объекта, например номер версии, язык и региональные параметры, имя сборки.The object is serialized to a stream, which carries not just the data, but information about the object's type, such as its version, culture, and assembly name. В этом формате потока объект можно сохранить в базе данных, файле или памяти.From that stream, it can be stored in a database, a file, or memory.

Применение сериализацииUses for serialization

Сериализация позволяет разработчику сохранять состояние объекта и воссоздавать его при необходимости. Это полезно для длительного хранения объектов или для обмена данными.Serialization allows the developer to save the state of an object and recreate it as needed, providing storage of objects as well as data exchange. Используя сериализацию, разработчик может, например, отправить объект удаленному приложению через веб-службу, передать объект из одного домена в другой, передать объект через брандмауэр в виде XML-строки, обеспечить защиту или сохранность сведений о пользователях в разных приложениях.Through serialization, a developer can perform actions like sending the object to a remote application by means of a Web Service, passing an object from one domain to another, passing an object through a firewall as an XML string, or maintaining security or user-specific information across applications.

Превращение объекта в сериализуемыйMaking an object serializable

Чтобы сериализовать объект, вам нужен сам этот объект, поток, который будет содержать объект, и класс Formatter.To serialize an object, you need the object to be serialized, a stream to contain the serialized object, and a Formatter. Классы для сериализации и десериализации объектов содержатся в System.Runtime.Serialization.System.Runtime.Serialization contains the classes necessary for serializing and deserializing objects.

Примените к типу атрибут SerializableAttribute, чтобы указать возможность сериализации экземпляров этого типа.Apply the SerializableAttribute attribute to a type to indicate that instances of this type can be serialized. Если в типе нет атрибута SerializableAttribute, при попытке сериализации выдается исключение.An exception is thrown if you attempt to serialize but the type doesn't have the SerializableAttribute attribute.

Если вы не хотите, чтобы поле в классе было сериализуемым, примените атрибут NonSerializedAttribute.If you don't want a field within your class to be serializable, apply the NonSerializedAttribute attribute. Если поле сериализуемого типа содержит указатель, дескриптор или специальные структуры данных для определенной среды, и содержимое этого поле невозможно разумно воссоздать в другой среде, такое поле лучше сделать несериализуемым.If a field of a serializable type contains a pointer, a handle, or some other data structure that is specific to a particular environment, and the field cannot be meaningfully reconstituted in a different environment, then you may want to make it nonserializable.

Если сериализуемый класс содержит ссылки на объекты других классов, имеющие пометку SerializableAttribute, эти объекты тоже будут сериализованы.If a serialized class contains references to objects of other classes that are marked SerializableAttribute, those objects will also be serialized.

Двоичная сериализация и сериализация XMLBinary and XML serialization

Вы можете использовать двоичную сериализацию или сериализацию XML.You can use binary or XML serialization. Процесс двоичной сериализации сериализует все элементы, даже доступные только для чтения. Также этот вариант имеет более высокую производительность.In binary serialization, all members, even members that are read-only, are serialized, and performance is enhanced. XML-сериализация создает более удобочитаемый код и предоставляет больше возможностей для совместного доступа к объектам и их использования в процессах взаимодействия.XML serialization provides more readable code, and greater flexibility of object sharing and usage for interoperability purposes.

Двоичная сериализацияBinary serialization

Двоичная сериализация использует двоичное кодирование, создавая компактные потоки для хранения или передачи через сетевые сокеты.Binary serialization uses binary encoding to produce compact serialization for uses such as storage or socket-based network streams.

сериализация XMLXML serialization

При XML-сериализации все открытые поля и свойства объекта (или параметры и возвращаемые значения метода) сериализуются в XML-поток по правилам определенного документа XSD (язык определения схемы XML).XML serialization serializes the public fields and properties of an object, or the parameters and return values of methods, into an XML stream that conforms to a specific XML Schema definition language (XSD) document. XML-сериализация создает строго типизированные классы с открытыми свойствами и полями, которые преобразуются в формат XML.XML serialization results in strongly typed classes with public properties and fields that are converted to XML. Пространство имен System.Xml.Serialization содержит классы, которые нужны для сериализации и десериализации XML.System.Xml.Serialization contains the classes necessary for serializing and deserializing XML.

Чтобы контролировать сериализацию и десериализацию экземпляров класса, осуществляемую XmlSerializer, вы можете применять к классам и их членам специальные атрибуты.You apply attributes to classes and class members to control the way the XmlSerializer serializes or deserializes an instance of the class.

Базовая и пользовательская сериализацииBasic and custom serialization

Существует два способа выполнить сериализацию — базовый и пользовательский.Serialization can be performed in two ways, basic and custom. Базовая сериализация использует платформу .NET Framework для автоматической сериализации объекта.Basic serialization uses the .NET Framework to automatically serialize the object.

Базовая сериализацияBasic serialization

Единственное условие для выполнения базовой сериализации — наличие атрибута SerializableAttribute у сериализуемого объекта.The only requirement in basic serialization is that the object has the SerializableAttribute attribute applied. Атрибут NonSerializedAttribute также можно использовать для исключения из сериализации определенных полей.The NonSerializedAttribute can be used to keep specific fields from being serialized.

При использовании базовой сериализации управление версиями объектов может привести к ошибкам.When you use basic serialization, the versioning of objects may create problems. Если проблемы с управлением версиями важны, рекомендуется использовать пользовательскую сериализацию.You would use custom serialization when versioning issues are important. Базовая сериализация является самым простым способом сериализации, но не дает почти никакого контроля над процессом.Basic serialization is the easiest way to perform serialization, but it does not provide much control over the process.

Пользовательская сериализацияCustom serialization

Используя пользовательскую сериализацию, вы можете точно указать, какие объекты и как будут сериализованы.In custom serialization, you can specify exactly which objects will be serialized and how it will be done. Класс должен иметь отметку SerializableAttribute и реализовывать интерфейс ISerializable.The class must be marked SerializableAttribute and implement the ISerializable interface.

Если вы хотите настраивать и десериализацию объекта, необходимо использовать пользовательский конструктор.If you want your object to be deserialized in a custom manner as well, you must use a custom constructor.

Сериализация конструктораDesigner serialization

Сериализация конструктора — это особая форма сериализации, при которой применяется способ постоянного хранения объектов, используемый в средствах разработки.Designer serialization is a special form of serialization that involves the kind of object persistence associated with development tools. Сериализация конструктора выполняет преобразование графа объекта в файл исходного кода, с помощью которого впоследствии можно восстановить граф объекта.Designer serialization is the process of converting an object graph into a source file that can later be used to recover the object graph. Этот файл исходного кода может содержать программный код, разметку или даже информацию из таблицы SQL.A source file can contain code, markup, or even SQL table information.

Связанные разделы и примерыRelated Topics and Examples

Пошаговое руководство: Сохранение объекта в Visual Studio (C#)Walkthrough: Persisting an Object in Visual Studio (C#)
Демонстрирует, как с помощью сериализации сохранить данные объекта между экземплярами, чтобы сохранять значения и извлекать их при следующем создании экземпляра объекта.Demonstrates how serialization can be used to persist an object's data between instances, allowing you to store values and retrieve them the next time the object is instantiated.

Практическое руководство. Чтение данных объекта из XML-файла (C#)How to: Read Object Data from an XML File (C#)
Показывает считывание данных объекта, которые ранее были записаны в XML-файл с помощью класса XmlSerializer.Shows how to read object data that was previously written to an XML file using the XmlSerializer class.

Практическое руководство. Запись данных объекта в XML-файл (C#)How to: Write Object Data to an XML File (C#)
Показывает, как записать объект из класса в XML-файл с помощью класса XmlSerializer.Shows how to write the object from a class to an XML file using the XmlSerializer class.