Об этом проекте

# MessagePack для C# (.NET Framework, .NET 8, Unity, Xamarin) MessagePack для C# — это чрезвычайно быстрый сериализатор MessagePack для экосистемы .NET, разработанный, чтобы превосходить другие сериализаторы C#. Он в 10 раз быстрее, чем MsgPack-Cli, и включает встроенную поддержку сжатия LZ4, что делает его идеальным для приложений, критичных к производительности, таких как игры, распределённые вычисления, микросервисы и кэши данных. ## Ключевые особенности - **Высокая производительность**: Использует генерацию IL-кода Just-In-Time (JIT) на поддерживаемых платформах или AOT-безопасные генераторы исходного кода для оптимальной скорости. - **Компактный бинарный размер**: Бинарный формат MessagePack компактен и выразителен, что уменьшает размер полезной нагрузки по сравнению с текстовыми форматами, такими как JSON. - **Сжатие LZ4**: Встроенный алгоритм сжатия для ещё меньших полезных нагрузок без значительной потери производительности. - **Кроссплатформенность**: Нацелен на .NET Standard 2.0 с оптимизациями для .NET 8+ и .NET Framework, поддерживает Unity и Xamarin. - **Гибкая сериализация**: Поддерживает как индексированные (int), так и строковые ключи, с атрибутами, такими как `[MessagePackObject]`, `[Key]` и `[IgnoreMember]`, для явного контроля. - **Поддержка анализаторов**: Включает анализаторы для выявления распространённых проблем сериализации во время компиляции, повышая надёжность кода. - **AOT-генерация кода**: Для платформ, таких как Unity и Xamarin, AOT-безопасные генераторы исходного кода обеспечивают совместимость без рефлексии во время выполнения. - **Расширения**: Официальные и сторонние пакеты для ReactiveProperty, обёрток Unity, форматтеров ASP.NET Core MVC и многого другого. ## Быстрый старт Определите класс или структуру с `[MessagePackObject]` и аннотируйте члены атрибутами `[Key]`: ```csharp [MessagePackObject] public class MyClass { [Key(0)] public int Age { get; set; } [Key(1)] public string FirstName { get; set; } [Key(2)] public string LastName { get; set; } [IgnoreMember] public string FullName => FirstName + LastName; } ``` Сериализация и десериализация: ```csharp var mc = new MyClass { Age = 99, FirstName = "hoge", LastName = "huga" }; byte[] bytes = MessagePackSerializer.Serialize(mc); MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes); // Преобразование в JSON для отладки string json = MessagePackSerializer.ConvertToJson(bytes); Console.WriteLine(json); // [99,"hoge","huga"] ``` ## Сериализация объектов - **Индексированные ключи**: Используйте `[Key(int)]` для сериализации на основе массива, которая быстрее и компактнее. - **Строковые ключи**: Используйте `[Key(string)]` или `[MessagePackObject(keyAsPropertyName: true)]` для ключей на основе имён свойств, что полезно для отладки. - **Резолвер без контракта**: Для динамических или анонимных типов используйте `ContractlessStandardResolver`, чтобы избежать явных атрибутов. - **Совместимость с DataContract**: Поддерживает атрибуты `[DataContract]` и `[DataMember]` для интеграции с существующими моделями. - **Неизменяемые типы**: Поддерживает сериализацию readonly/неизменяемых членов через `[SerializationConstructor]` или записи C# 9.0. ## Расширенные возможности - **Union**: Сериализация полиморфных типов с использованием атрибутов `[Union]` на интерфейсах или абстрактных классах. - **Сериализация без типа**: Используйте `TypelessContractlessStandardResolver` для поведения, подобного бинарному форматтеру. - **Динамическая десериализация**: Десериализация в `ExpandoObject` или использование индексаторов словаря для доступа без типизации. - **Пользовательские форматтеры**: Реализуйте `IMessagePackFormatter<T>` для полного контроля над логикой сериализации. - **Резолверы**: Составляйте пользовательские резолверы для управления сериализацией типов, включая поддержку приватных членов. ## Советы по производительности - Используйте индексированные ключи вместо строковых для лучшей производительности. - Создавайте пользовательские составные резолверы для оптимизации конкретных типов. - Используйте нативные резолверы, такие как `StandardResolver`, для распространённых сценариев. - Обращайте внимание на копирование буферов; используйте перегрузки `MessagePackSerializer.Serialize`, принимающие `IBufferWriter<byte>`. - Выбирайте сжатие LZ4 для сценариев, ограниченных сетью или хранилищем. ## Установка Установка через NuGet: ```ps1 Install-Package MessagePack ``` Для Unity следуйте руководству [Unity Support](doc/unity.md). Дополнительные пакеты, такие как `MessagePack.ReactiveProperty` и `MessagePack.AspNetCoreMvcFormatter`, доступны для конкретных интеграций. ## Миграция При обновлении с предыдущей основной версии смотрите [руководство по миграции](doc/migration.md) для информации о критических изменениях и обновлениях. ## Сообщество и поддержка - [Репозиторий GitHub](https://github.com/MessagePack-CSharp/MessagePack-CSharp) - [Чат Gitter](https://gitter.im/MessagePack-CSharp/Lobby) - [Пакет NuGet](https://www.nuget.org/packages/messagepack) ## Лицензия Этот проект лицензирован под лицензией MIT. Подробности смотрите в файле [LICENSE](LICENSE).