Об этом проекте
# 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).
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.