Поделиться через


Выбор сериализатора

Для сериализации типов .NET нет замены BinaryFormatter, но для сериализации типов .NET не рекомендуется использовать несколько сериализаторов. Независимо от выбранного сериализатора изменения потребуются для интеграции с новым сериализатором. Во время этих миграций важно учитывать компромиссы между тем, чтобы по возможности принуждать новый сериализатор обрабатывать существующие типы с минимальными изменениями, и рефакторингом типов для обеспечения идиоматичной сериализации с выбранным сериализатором. После выбора сериализатора его документация должна быть изучена для получения рекомендаций.

Если формат двоичной сериализации не является обязательным, можно использовать форматы сериализации JSON или XML. Эти сериализаторы включены в .NET и официально поддерживаются.

  1. JSON с помощью System.Text.Json
  2. Использование XML System.Runtime.Serialization.DataContractSerializer

Если для ваших сценариев важно компактное двоичное представление, рекомендуется использовать следующие форматы сериализации и сериализаторы с открытым кодом:

  1. MessagePack с помощью MessagePack для C#
  2. Буферы протокола с помощью protobuf-net

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

Функция BinaryFormatter System.Text.Json DataContractSerializer MessagePack для C# protobuf-net
Serialization формат binary (NRBF) JSON XML binary (MessagePack) binary (буферы протокола)
Компактное представление ✔️ ✔️ ✔️
Доступный для чтения человеком ❌️ ✔️ ✔️ ❌️ ❌️
Производительность ❌️ ✔️ ✔️ ✔️
[Serializable] Поддержка атрибутов ✔️ ✔️
Сериализация общедоступных типов ✔️ ✔️ ✔️ ✔️ ✔️
Сериализация недоступных типов ✔️ ✔️ ✔️ ✔️ (требуется сопоставитель) ✔️
Сериализация полей ✔️ ✔️ (согласие) ✔️ ✔️ (обязательный атрибут) ✔️ (обязательный атрибут)
Сериализация не открытых полей ✔️ ✔️ (требуется сопоставитель) ✔️ ✔️ (требуется сопоставитель) ✔️ (обязательный атрибут)
Сериализация свойств ✔️* ✔️ ✔️ ✔️ (обязательный атрибут) ✔️ (обязательный атрибут)
Десериализация элементов чтения ✔️ ✔️ (обязательный атрибут) ✔️ ✔️ ✔️ (обязательный без параметров ctor)
Иерархия полиморфных типов ✔️ ✔️ (обязательный атрибут) ✔️ ✔️ (обязательный атрибут) ✔️ (обязательный атрибут)
Поддержка AOT ❌️ ✔️ ✔️ ❌ (запланировано)

JSON с помощью System.Text.Json

Библиотека System.Text.Json — это современный сериализатор, который подчеркивает безопасность, высокую производительность и низкое выделение памяти для формата нотации объектов JavaScript (JSON). JSON доступен для чтения и имеет широкую кроссплатформенную поддержку. Хотя текстовый формат не так компактный, как двоичные форматы, он может быть значительно уменьшен путем сжатия.

Serialization исключает элементы, не являющиеся открытыми и чтением, если только они не обрабатываются с помощью атрибутов и конструкторов. System.Text.Json также поддерживает настраиваемую сериализацию и десериализацию для большего контроля над преобразованием типов в JSON и наоборот. System.Text.Json не поддерживает [Serializable] атрибут.

Миграция в System.Text.Json (JSON).

XML с помощью DataContractSerializer

DataContractSerializerпредставлен в платформа .NET Framework 3.0 и используется для сериализации и десериализации данных, отправленных в сообщениях Windows Communication Foundation (WCF). DataContractSerializer — это xml-сериализатор, который полностью поддерживает модель программирования сериализации, используемую BinaryFormatter, что означает, что он учитывает атрибут [Serializable] и реализацию ISerializable. Следовательно, это сериализатор, в который требуется наименьшее количество усилий для миграции. Однако для этого требуется указывать заранее известные типы (но большинство коллекций и примитивов .NET находятся в списке разрешений по умолчанию и не нужно указывать).

Хотя DataContractSerializer имеет эти функциональные преимущества при переходе с BinaryFormatter, это не так современно или производительно, как и другие варианты.

Миграция на DataContractSerializer (XML).

Предупреждение

Не путайте DataContractSerializer с NetDataContractSerializer. NetDataContractSerializer определяется как опасный сериализатор.

Двоичный файл с помощью MessagePack

MessagePack представляет собой компактный формат двоичной сериализации, что приводит к уменьшению размера сообщений по сравнению с JSON и XML. Библиотека MessagePack для C# открытый код является высокопроизводительной и предлагает встроенное супер-быстрое сжатие LZ4 для еще большего размера данных. Он лучше всего работает, если типы данных аннотируются с DataContractSerializer помощью собственных атрибутов библиотеки. Его можно настроить для поддержки сред AOT, не открытых типов и членов, а также только для чтения типов и членов.

Миграция в MessagePack (binary).

Двоичный файл с помощью protobuf-net

Библиотека protobuf-net — это сериализатор на основе контракта для .NET, использующий двоичный формат сериализации Protocol Buffers . API следует типичным шаблонам .NET и в целом сравним с XmlSerializer и DataContractSerializer. Эта популярная библиотека также богата функциями и может обрабатывать не общедоступные типы и поля, но многие сценарии требуют применения атрибутов к элементам.

Миграция на protobuf-net (binary).