Миграция в MessagePack (двоичный файл)
MessagePack — это компактный двоичный serialization формат, что приводит к уменьшению размера сообщений по сравнению с JSON и XML. Библиотека MessagePack для C# открытый код является высокопроизводительной и предлагает встроенное супер-быстрое сжатие LZ4 для еще большего размера данных. Он лучше всего работает, если типы данных аннотируются с DataContractSerializer
помощью собственных атрибутов библиотеки. Его можно настроить для поддержки сред AOT, не открытых типов и членов, а также только для чтения типов и членов.
Некоторые поведения и функции MessagePack для C# будут заметны во время миграции BinaryFormatter, особенно если нельзя вносить изменения в API сериализованных типов или необходимо свести к минимуму.
По умолчанию сериализуются только общедоступные типы. Частные и внутренние структуры и классы можно сериализовать только в том случае, если
StandardResolverAllowPrivate.Options
предоставляется в качестве аргументаMessagePackSerializer.Serialize
иMessagePackSerializer.Deserialize
методов.MessagePack требует, чтобы каждый сериализуемый тип был аннотирован атрибутом
[MessagePackObject]
. Это можно избежать, используя ContractlessStandardResolver, но это может вызвать проблемы с управлением версиями в будущем.Каждое сериализуемое нестатическое поле и свойство должно быть аннотировано атрибутом
[Key]
. Если вы заметите тип атрибутом[MessagePackObject(keyAsPropertyName: true)]
, члены не требуют явных заметок. В таком случае, чтобы игнорировать некоторые открытые члены, используйте[IgnoreMember]
атрибут.Чтобы сериализовать частные члены, используйте StandardResolverAllowPrivate.
System.Runtime.Serialization
заметки можно использовать вместо заметок MessagePack,[DataContract]
а не[IgnoreMember]
[MessagePackObject]
[DataMember]
[Key]
[IgnoreDataMember]
вместо. Эти заметки могут быть полезны, если вы хотите избежать зависимости от MessagePack в библиотеке, которая определяет сериализуемые типы.Он поддерживает типы и элементы, неизменяемые для чтения. Сериализатор попытается использовать общедоступный конструктор с лучшим списком подходящих аргументов. Конструктор можно указать явным образом с помощью
[SerializationConstructor]
атрибута.Serialization произвольные типы поддерживаются с помощью пользовательских средств форматирования, которые просты в создании. Это удаляет все требования к атрибутам и определенным конструкторам или шаблонам элементов.
Сериализатор поддерживает наиболее часто используемые встроенные типы и коллекции, предоставляемые библиотеками базовых классов .NET. Полный список можно найти в официальных документах. Он имеет точки расширения, которые позволяют настраивать.
Предупреждение
MessagePack имеет API для десериализации данных без ограничений типов. Для заметок безопасности MessagePack эти API следует избежать.
Предупреждение
Некоторые API MessagePack имеют поведение, настраиваемое с помощью изменяемых статических значений, что означает, что код может успешно завершиться или завершиться сбоем на основе другого кода в том же процессе, AssemblyLoadContext или AppDomain. Вы можете обеспечить устойчивость кода, ссылаясь на пакет MessagePackAnalyzer и включив анализаторы MsgPack001 и MsgPack002, которые вызывают любое использование API с изменяемым поведением.