Основы сериализации в .NET Framework

Обновлен: Ноябрь 2007

Сериализация представляет собой процесс преобразования объекта в поток байтов с целью сохранения его в памяти, в базе данных или в файле. Ее основное назначение — сохранить состояние объекта для того, чтобы иметь возможность воссоздать его при необходимости. Обратный процесс называется десериализацией.

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

На этом рисунке показан общий процесс сериализации.

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

Объект сериализуется в поток, который переносит не только данные, но сведения о типе объекта, такие как его версию, язык и региональные параметры, а также имя сборки. Из этого потока объект можно сохранить в базе данных, файле или памяти.

Применение сериализации

Сериализация позволяет разработчику сохранять состояние объекта и воссоздавать его при необходимости, обеспечивая хранение объектов, а также обмен данными. С помощью сериализации разработчик может выполнять такие действия, как отправка объекта удаленному приложению посредством веб-службы, передача объекта из одного домена в другой, передача объекта через брандмауэр в виде XML-строки и хранение информации о безопасности или конкретном пользователе, используемой несколькими приложениями.

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

Для сериализации объекта требуется объект, который будет сериализован, поток, который будет содержать сериализованный объект, и объект Formatter. Пространство имен System.Runtime.Serialization содержит классы, необходимые для сериализации и десериализации объектов.

Для указания на то, что экземпляры данного типа могут быть сериализованы, примените к типу атрибут SerializableAttribute. При попытке сериализации типа, не имеющего атрибута SerializableAttribute, возникает исключение SerializationException.

Если вы не хотите сериализовать поля внутри класса, примените атрибут NonSerializedAttribute. Если поле сериализуемого типа содержит указатель, дескриптор или некоторые другие структуры данных, которые специфичны для определенной среды, и поле не может быть однозначно восстановлено в другой среде, то желательно сделать его несериализуемым.

Если сериализуемый класс содержит ссылки на объекты других классов, которые помечены атрибутом SerializableAttribute, эти объекты также будут сериализуемыми.

Двоичная и XML-сериализация

Можно использовать двоичную сериализацию или XML-сериализацию. При двоичной сериализации сериализуются все элементы, даже те, которые предназначены только для чтения, за счет чего повышается производительность. XML-сериализация обеспечивает более удобочитаемый код, а также большую гибкость совместного доступа и использования объекта в целях взаимодействия.

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

При двоичной сериализации используется двоичная кодировка, обеспечивающая компактную сериализацию объекта для хранения или передачи в сетевых потоках на основе сокетов. Она не подходит для передачи данных через брандмауэр, но обеспечивает более высокую производительность при сохранении данных.

XML-сериализация

При XML-сериализации открытые поля и свойства объекта или параметры и возвращаемые значения методов сериализуются в XML-поток в соответствии с особым документом, составленным на языке XSD (язык определения схемы XML). XML-сериализация приводит к образованию строго типизированных классов с открытыми свойствами и полями, которые преобразуются в формат XML. Классы, необходимые для XML-сериализации и десериализации, содержатся в пространстве имен System.Xml.Serialization.

Для управления способом, с помощью которого XmlSerializer сериализует или десериализует экземпляр класса, можно применять атрибуты к классам и членам класса. Дополнительные сведения см. в разделах Controlling XML Serialization Using Attributes и Attributes That Control XML Serialization.

В следующей таблице перечислены задачи, связанные с XML-сериализацией:

To

См. раздел

Сериализация объекта

How to: Serialize an Object

Десериализация объекта

How to: Deserialize an Object

Создание документации классов и XML-схемы

How to: Use the XML Schema Definition Tool to Generate Classes and XML Schema Documents

Квалификация элемента XML и имен атрибутов XML

How to: Qualify XML Element and XML Attribute Names

Указание имени альтернативного элемента для XML-потока

How to: Specify an Alternate Element Name for an XML Stream

Управление сериализацией производных классов

How to: Control Serialization of Derived Classes

SOAP-сериализация

XML-сериализация может также использоваться для сериализации объектов в потоки XML, которые соответствуют спецификации SOAP. SOAP — это протокол, основанный на XML и созданный специально для передачи вызовов процедур с использованием XML. Как и в обычной XML-сериализации, атрибуты можно использовать для управления формой SOAP-сообщений в литеральном стиле, генерируемых веб-службой XML. Дополнительные сведения см. в разделах XML Serialization with XML Web Services и Attributes That Control Encoded SOAP Serialization.

В следующей таблице перечислены задачи, связанные с XML-сериализацией в кодировке SOAP:

To

См. раздел

Сериализация объекта в поток XML с кодировкой SOAP

How to: Serialize an Object as a SOAP-Encoded XML Stream

Переопределение XML-сериализации с кодировкой SOAP

How to: Override Encoded SOAP XML Serialization

Базовая и настраиваемая сериализация

Есть два способа выполнения сериализации: базовая сериализация и настраиваемая сериализация. При базовой сериализации объект сериализуется автоматически при помощи платформы .NET Framework.

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

Единственное требование при базовой сериализации состоит в том, что объект должен имеет атрибут SerializableAttribute. Для предотвращения сериализации определенных полей можно использовать атрибут NonSerializedAttribute.

При использовании базовой сериализации могут возникать проблемы, связанные с управлением версиями объектов, и в этом случае настраиваемая сериализация может быть предпочтительнее. Базовая сериализация является наиболее простым способом выполнения сериализации, но она не дает большого контроля над процессом.

Настраиваемая сериализация

При настраиваемой сериализации можно указать точно, какие объекты будут сериализованы, и как будет производиться сериализация. Этот класс должен быть помечен атрибутом SerializableAttribute и реализовывать интерфейс ISerializable.

Если требуется, чтобы и десериализация объекта производилась настраиваемым способом, необходимо использовать пользовательский конструктор.

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

Сериализации конструктора — это особая форма сериализации, использующая способ постоянного хранения объектов, обычно применяемый в средствах разработки. Сериализация конструктора — это процесс преобразования графа объекта в исходный файл, который впоследствии можно будет использовать для восстановления графа объекта. Исходный файл может содержать код, разметку или даже информацию из таблицы SQL. Дополнительные сведения см. в разделе Общие сведения о сериализации конструктора.

См. также

Задачи

How to: Chunk Serialized Data

Основные понятия

Examples of XML Serialization

Классы, используемые при сериализации в .NET Framework