Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Для сериализации типов .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 формат | двоичный (NRBF) | JSON (JavaScript Object Notation) | XML | бинарный (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. Эта популярная библиотека также богата функциями и может обрабатывать не общедоступные типы и поля, но многие сценарии требуют применения атрибутов к элементам.