• Статья
  • Чтение занимает 2 мин

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

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

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

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

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

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

  • Отправка объекта в удаленное приложение с помощью веб-службы
  • Передача объекта из одного домена в другой
  • Передача объекта через брандмауэр в виде строки JSON или XML
  • Хранение сведений о безопасности и пользователях между приложениями

Сериализация JSON

В пространстве имен System.Text.Json содержатся классы для сериализации и десериализации в формате JSON. JSON — это открытый стандарт, который широко применяется для обмена данными через Интернет.

В формате JSON открытые свойства объекта сериализуются в строку, массив байтов или поток в соответствии со спецификацией JSON RFC 8259. Для управления способами сериализации или десериализации с использованием JsonSerializer экземпляр класса:

  • использует объект JsonSerializerOptions;
  • применяет к классам или свойствам атрибуты из пространства имен System.Text.Json.Serialization;
  • реализует пользовательские преобразователи.

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

В пространстве имен System.Runtime.Serialization содержатся классы для сериализации и десериализации в двоичном формате и формате XML.

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

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

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

Для двоичной сериализации или сериализации XML вам потребуются:

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

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

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

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

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

Существует два способа выполнить двоичную сериализацию или сериализацию XML — базовый и пользовательский.

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

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

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

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

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

В разделе Обзор System.Text.Json описывается способ получить библиотеку System.Text.Json.

Практическое руководство. Сериализация и десериализация JSON в .NET.
Содержит сведения о том, как считывать и записывать данные объекта в формате JSON с использованием класса JsonSerializer.

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

Практическое руководство. Чтение данных объекта из XML-файла (C#)
Показывает считывание данных объекта, которые ранее были записаны в XML-файл с помощью класса XmlSerializer.

Практическое руководство. Запись данных объекта в XML-файл (C#)
Показывает, как записать объект из класса в XML-файл с помощью класса XmlSerializer.