Выбор сериализатора
Для сериализации типов .NET нет замены BinaryFormatter, но для сериализации типов .NET не рекомендуется использовать несколько сериализаторов. Независимо от выбранного сериализатора изменения потребуются для интеграции с новым сериализатором. Во время этих миграций важно учитывать компромиссы между тем, чтобы по возможности принуждать новый сериализатор обрабатывать существующие типы с минимальными изменениями, и рефакторингом типов для обеспечения идиоматичной сериализации с выбранным сериализатором. После выбора сериализатора его документация должна быть изучена для получения рекомендаций.
Если формат двоичной сериализации не является обязательным, можно использовать форматы сериализации JSON или XML. Эти сериализаторы включены в .NET и официально поддерживаются.
- JSON с помощью System.Text.Json
- Использование XML
System.Runtime.Serialization.DataContractSerializer
Если для ваших сценариев важно компактное двоичное представление, рекомендуется использовать следующие форматы сериализации и сериализаторы с открытым кодом:
- MessagePack с помощью MessagePack для C#
- Буферы протокола с помощью 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
. Эта популярная библиотека также богата функциями и может обрабатывать не общедоступные типы и поля, но многие сценарии требуют применения атрибутов к элементам.