Сериализация (Visual Basic)

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

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

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

Serialization graphic

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Связанные разделы и примеры

Пошаговое руководство. Сохранение объекта в Visual Studio (Visual Basic)
Демонстрирует, как с помощью сериализации сохранить данные объекта между экземплярами, чтобы сохранять значения и извлекать их при следующем создании экземпляра объекта.

How to: Read Object Data from an XML File (Visual Basic) (Практическое руководство. Чтение данных объекта из XML-файла (Visual Basic))
Показывает считывание данных объекта, которые ранее были записаны в XML-файл с помощью класса XmlSerializer.

How to: Write Object Data to an XML File (Visual Basic) (Практическое руководство. Запись данных объекта в XML-файл (Visual Basic))
Показывает, как записать объект из класса в XML-файл с помощью класса XmlSerializer.