Sobre o projeto

# MessagePack para C# (.NET Framework, .NET 8, Unity, Xamarin) MessagePack para C# é um serializador MessagePack extremamente rápido para o ecossistema .NET, projetado para superar outros serializadores C#. É 10x mais rápido que MsgPack-Cli e inclui suporte integrado à compressão LZ4, tornando-o ideal para aplicações críticas de desempenho, como jogos, computação distribuída, microsserviços e caches de dados. ## Principais Recursos - **Alto Desempenho**: Utiliza geração de código IL Just-In-Time (JIT) em plataformas suportadas ou geradores de código-fonte seguros para AOT, visando velocidade ideal. - **Tamanho Binário Compacto**: O formato binário do MessagePack é compacto e expressivo, reduzindo o tamanho do payload em comparação com formatos baseados em texto, como JSON. - **Compressão LZ4**: Algoritmo de compressão integrado para payloads ainda menores, sem perda significativa de desempenho. - **Multiplataforma**: Tem como alvo .NET Standard 2.0 com otimizações para .NET 8+ e .NET Framework, e suporta Unity e Xamarin. - **Serialização Flexível**: Suporta chaves indexadas (int) e de string, com atributos como `[MessagePackObject]`, `[Key]` e `[IgnoreMember]` para controle explícito. - **Suporte a Analisadores**: Inclui analisadores para detectar problemas comuns de serialização em tempo de compilação, melhorando a robustez do código. - **Geração de Código AOT**: Para plataformas como Unity e Xamarin, geradores de código-fonte seguros para AOT garantem compatibilidade sem reflexão em tempo de execução. - **Extensões**: Pacotes oficiais e de terceiros para ReactiveProperty, shims Unity, formatadores ASP.NET Core MVC e mais. ## Início Rápido Defina uma classe ou struct com `[MessagePackObject]` e anote os membros com atributos `[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; } ``` Serialize e desserialize: ```csharp var mc = new MyClass { Age = 99, FirstName = "hoge", LastName = "huga" }; byte[] bytes = MessagePackSerializer.Serialize(mc); MyClass mc2 = MessagePackSerializer.Deserialize<MyClass>(bytes); // Converta para JSON para depuração string json = MessagePackSerializer.ConvertToJson(bytes); Console.WriteLine(json); // [99,"hoge","huga"] ``` ## Serialização de Objetos - **Chaves Indexadas**: Use `[Key(int)]` para serialização baseada em array, que é mais rápida e compacta. - **Chaves de String**: Use `[Key(string)]` ou `[MessagePackObject(keyAsPropertyName: true)]` para chaves baseadas em nomes de propriedades, útil para depuração. - **Resolver Contractless**: Para tipos dinâmicos ou anônimos, use `ContractlessStandardResolver` para evitar atributos explícitos. - **Compatibilidade com DataContract**: Suporta atributos `[DataContract]` e `[DataMember]` para integração com modelos existentes. - **Tipos Imutáveis**: Suporta serialização de membros somente leitura/imutáveis via `[SerializationConstructor]` ou registros C# 9.0. ## Recursos Avançados - **Union**: Serialize tipos polimórficos usando atributos `[Union]` em interfaces ou classes abstratas. - **Serialização Sem Tipo**: Use `TypelessContractlessStandardResolver` para comportamento semelhante ao BinaryFormatter. - **Desserialização Dinâmica**: Desserialize para `ExpandoObject` ou use indexadores de dicionário para acesso sem tipo. - **Formatadores Personalizados**: Implemente `IMessagePackFormatter<T>` para controle total sobre a lógica de serialização. - **Resolvers**: Componha resolvers personalizados para controlar como os tipos são serializados, incluindo suporte a membros privados. ## Dicas de Desempenho - Use chaves indexadas em vez de chaves de string para melhor desempenho. - Crie resolvers compostos personalizados para otimizar tipos específicos. - Use resolvers nativos como `StandardResolver` para cenários comuns. - Esteja atento à cópia de buffers; use sobrecargas de `MessagePackSerializer.Serialize` que aceitam `IBufferWriter<byte>`. - Escolha compressão LZ4 para cenários limitados por rede ou armazenamento. ## Instalação Instale via NuGet: ```ps1 Install-Package MessagePack ``` Para Unity, siga o guia [Suporte Unity](doc/unity.md). Pacotes adicionais como `MessagePack.ReactiveProperty` e `MessagePack.AspNetCoreMvcFormatter` estão disponíveis para integrações específicas. ## Migração Se estiver atualizando de uma versão principal anterior, consulte o [guia de migração](doc/migration.md) para mudanças significativas e atualizações. ## Comunidade e Suporte - [Repositório GitHub](https://github.com/MessagePack-CSharp/MessagePack-CSharp) - [Chat Gitter](https://gitter.im/MessagePack-CSharp/Lobby) - [Pacote NuGet](https://www.nuget.org/packages/messagepack) ## Licença Este projeto é licenciado sob a Licença MIT. Consulte o arquivo [LICENSE](LICENSE) para detalhes.