Compartilhar via


Migrar para MessagePack (binário)

O MessagePack é um formato compacto binário, serialization resultando em tamanhos de mensagem menores em comparação com JSON e XML. A biblioteca MessagePack for C# de código aberto é de alto desempenho e oferece compactação LZ4 super-rápida integrada para um tamanho de dados ainda menor. Funciona melhor quando os tipos de dados são anotados com DataContractSerializer ou com os próprios atributos da biblioteca. Ela pode ser configurada para dar suporte a ambientes AOT, tipos e membros não públicos e tipos e membros somente leitura.

Alguns comportamentos e recursos do MessagePack para C# serão notáveis durante as migrações de BinaryFormatter, especialmente se as alterações nas APIs dos tipos serializados não puderem ser feitas ou precisarem ser minimizadas.

  • Por padrão, somente os tipos públicos são serializáveis. Estruturas e classes privadas e internas só podem ser serializadas quando StandardResolverAllowPrivate.Options é fornecido como um argumento para métodos MessagePackSerializer.Serialize e MessagePackSerializer.Deserialize.

  • MessagePack requer que cada tipo serializável seja anotado com o atributo [MessagePackObject]. É possível evitar isso usando o ContractlessStandardResolver, mas isso pode causar problemas com o controle de versão no futuro.

  • Cada campo não estático serializável e uma propriedade precisam ser anotados com o atributo [Key]. Se você anotar o tipo com o atributo [MessagePackObject(keyAsPropertyName: true)], os membros não precisarão de anotações explícitas. Nesse caso, para ignorar determinados membros públicos, use o atributo [IgnoreMember].

  • Para serializar membros privados, use StandardResolverAllowPrivate.

  • Anotações System.Runtime.Serialization podem ser usadas em vez de anotações MessagePack: [DataContract] em vez de [MessagePackObject], [DataMember] em vez de [Key]e [IgnoreDataMember] em vez de [IgnoreMember]. Essas anotações podem ser úteis se você quiser evitar uma dependência do MessagePack na biblioteca que define tipos serializáveis.

  • Ele dá suporte a tipos e membros readonly/imutáveis. O serializador tentará usar o construtor público com a melhor lista de argumentos correspondente. O construtor pode ser especificado de forma explícita usando o atributo [SerializationConstructor].

  • Serialization de tipos arbitrários têm suporte por meio de formatadores personalizados que são simples de criar. Isso remove todos os requisitos para atributos e padrões específicos de construtor ou membro.

  • O serializador dá suporte a tipos internos e coleções usados com mais frequência fornecidos pelas bibliotecas de classes base do .NET. Você pode encontrar a lista completa em documentos oficiais. Ele tem pontos de extensão que permitem a personalização.

Aviso

O MessagePack tem APIs para permitir a desserialização de dados sem restrições de tipo. De acordo com as Notas de Segurança do MessagePack, essas APIs devem ser evitadas.

Aviso

Algumas APIs MessagePack têm um comportamento personalizável por meio de estática mutável, o que significa que seu código pode ter êxito ou falhar com base no que outro código no mesmo processo, AssemblyLoadContext ou AppDomain pode fazer. Você pode manter seu código resiliente ao também fazer referência ao pacote MessagePackAnalyzer e habilitar os analisadores MsgPack001 e MsgPack002, que chamam todos os usos de APIs com comportamento alterável.