Compartilhar via


Escolher um serializador

Não há substituição imediata para BinaryFormatter, mas há vários serializadores recomendados para serializar tipos .NET. Independentemente de qual serializador você escolher, serão necessárias alterações para integração com o novo serializador. Durante essas migrações, é importante considerar as compensações entre coagir a novo serializador a manipular os tipos existentes com o mínimo de alterações possíveis versus refatoração para habilitar tipos idiomáticos serialization com o serializador selecionado. Depois que um serializador é escolhido, sua documentação deve ser estudada para obter as melhores práticas.

Se um formato binário serialization não for um requisito, você poderá considerar o uso de formatos JSON ou serialization XML. Esses serializadores estão incluídos no .NET e têm suporte oficial.

  1. JSON usando System.Text.Json
  2. XML usando System.Runtime.Serialization.DataContractSerializer

Se uma representação binária compacta for importante para seus cenários, os seguintes serialization formatos e serializadores de software livre serão recomendados:

  1. MessagePack usando MessagePack para C#
  2. Buffers de protocolo usando protobuf-net

Se você tem controle para alterar a forma da API do tipo serializado, isso influenciará sua direção e abordagem serialization. A migração para esses serializadores pode ser mais simples com a capacidade de anotar tipos com novos atributos, adicionar novos construtores, tornar públicos/membros tipos e alterar campos para propriedades. Sem essa capacidade, o uso de serializadores modernos pode exigir a implementação de conversores ou resolvedores personalizados.

Recurso BinaryFormatter System.Text.Json DataContractSerializer MessagePack para C# protobuf-net
Formato Serialization binário (NRBF) JSON XML binário (MessagePack) binário (buffers de protocolo)
Representação compacta ✔️ ✔️ ✔️
Legível por humanos ❌️ ✔️ ✔️ ❌️ ❌️
Desempenho ❌️ ✔️ ✔️ ✔️
[Serializable] suporte ao atributo ✔️ ✔️
Serialização de tipos públicos ✔️ ✔️ ✔️ ✔️ ✔️
Serialização de tipos não públicos ✔️ ✔️ ✔️ ✔️ (resolvedor necessário) ✔️
Serialização de campos ✔️ ✔️ (aceitar) ✔️ ✔️ (atributo obrigatório) ✔️ (atributo obrigatório)
Serialização de campos não públicos ✔️ ✔️ (resolvedor necessário) ✔️ ✔️ (resolvedor necessário) ✔️ (atributo obrigatório)
Serializando propriedades ✔️* ✔️ ✔️ ✔️ (atributo obrigatório) ✔️ (atributo obrigatório)
Desserializando membros somente leitura ✔️ ✔️ (atributo obrigatório) ✔️ ✔️ ✔️ (ctor sem parâmetros obrigatório)
Hierarquia de tipos polimórficos ✔️ ✔️ (atributo obrigatório) ✔️ ✔️ (atributo obrigatório) ✔️ (atributo obrigatório)
Suporte a AOT ❌️ ✔️ ✔️ ❌ (planejado)

JSON usando System.Text.Json

A biblioteca System.Text.Json é um serializador moderno que enfatiza a segurança, o alto desempenho e a baixa alocação de memória para o formato JSON (JavaScript Object Notation). O JSON é legível por humanos e tem amplo suporte multiplataforma. Embora o formato baseado em texto não seja tão compacto quanto os formatos binários, ele pode ser significativamente reduzido em tamanho por meio da compactação.

Serialization exclui membros não públicos e somente leitura, a menos que sejam tratados especificamente por meio de atributos e construtores. System.Text.Json também dá suporte à personalização serialization e desserialização para obter mais controle sobre como os tipos são convertidos em JSON e vice-versa. System.Text.Json não dá suporte ao atributo [Serializable].

Migre para System.Text.Json (JSON)

XML usando o DataContractSerializer

DataContractSerializer foi introduzido no .NET Framework 3.0 e é usado para serializar e desserializar dados enviados em mensagens do Windows Communication Foundation (WCF). O DataContractSerializer é um serializador XML que oferece suporte total ao modelo de programação serialization usado pelo BinaryFormatter, que significa que ele respeita o atributo [Serializable] e a implementação de ISerializable. Portanto, é o serializador que requer menos esforço para migrar. No entanto, ele exige que os tipos conhecidos sejam especificados antecipadamente (mas a maioria das coleções e tipos primitivos do .NET estão em uma lista de permissões padrão e não precisam ser especificados).

Embora DataContractSerializer carregue esses benefícios funcionais ao migrar do BinaryFormatter, não é tão moderno ou eficiente quanto as outras opções.

Migre para DataContractSerializer (XML).

Aviso

Não confunda DataContractSerializer com NetDataContractSerializer. NetDataContractSerializer é identificado como um serializador perigoso.

Binário usando MessagePack

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. Ele pode ser configurado para dar suporte a ambientes AOT, tipos e membros não públicos e tipos e membros somente leitura.

Migre para o MessagePack (binário).

Binário usando protobuf-net

A protobuf-net é uma biblioteca baseada em contrato para .NET que usa o formato de Buffers de Protocoloserialization binário. A API segue os padrões típicos do .NET é amplamente comparável a XmlSerializer e DataContractSerializer. Essa biblioteca popular também é rica em recursos e pode lidar com tipos e campos não públicos, mas muitos cenários exigem a aplicação de atributos aos membros.

Migre para protobuf-net (binário).