Partilhar via


Escolha um serializador

Não há substituição drop-in para BinaryFormattero , mas há vários serializadores recomendados para serializar tipos .NET. Independentemente do serializador escolhido, serão necessárias alterações para a integração com o novo serializador. Durante essas migrações, é importante considerar as compensações entre coagir o novo serializador a lidar com tipos existentes com o menor número possível de alterações versus tipos de refatoração para habilitar a serialização idiomática com o serializador escolhido. Uma vez escolhido um serializador, sua documentação deve ser estudada para as melhores práticas.

Se um formato de serialização binário não for um requisito, você poderá considerar o uso de formatos de serialização JSON ou XML. Esses serializadores estão incluídos no .NET e são oficialmente suportados.

  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 formatos de serialização e serializadores de código aberto são recomendados:

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

Ter controlo sobre a alteração da forma da API do tipo serializado influenciará a sua direção e abordagem relativamente à serialização. A migração para esses serializadores pode ser mais simples com a capacidade de anotar tipos com novos atributos, adicionar novos construtores, tornar tipos/membros públicos e alterar campos para propriedades. Sem essa capacidade, o uso de serializadores modernos pode exigir a implementação de conversores ou resolvedores personalizados.

Caraterística BinaryFormatter System.Text.Json DataContractSerializer (Serializador de Contratos de Dados) MessagePack para C# Protobuf-Net
Serialization Formato binário (NRBF) JSON (JavaScript Object Notation) XML binário (MessagePack) binário (buffers de protocolo)
Representação compacta ✔️ ✔️ ✔️
Legível por humanos ❌️ ✔️ ✔️ ❌️ ❌️
Desempenho ❌️ ✔️ ✔️ ✔️
[Serializable] Suporte a atributos ✔️ ✔️
Serialização de tipos públicos ✔️ ✔️ ✔️ ✔️ ✔️
Serialização de tipos não públicos ✔️ ✔️ ✔️ ✔️ (resolver necessário) ✔️
Campos de serialização ✔️ ✔️ (adesão voluntária) ✔️ ✔️ (atributo obrigatório) ✔️ (atributo obrigatório)
Serialização de campos não públicos ✔️ ✔️ (resolver necessário) ✔️ ✔️ (resolver necessário) ✔️ (atributo obrigatório)
Propriedades de serialização ✔️* ✔️ ✔️ ✔️ (atributo obrigatório) ✔️ (atributo obrigatório)
Desserializando membros somente leitura ✔️ ✔️ (atributo obrigatório) ✔️ ✔️ ✔️ (ctor sem parâmetros necessário)
Hierarquia de tipos polimórficos ✔️ ✔️ (atributo obrigatório) ✔️ ✔️ (atributo obrigatório) ✔️ (atributo obrigatório)
Suporte AOT ❌️ ✔️ ✔️ ❌ (planeado)

JSON usando System.Text.Json

A System.Text.Json biblioteca é 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). 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 através da compressão.

Serialization exclui membros não públicos e somente leitura, a menos que especificamente manipulados por meio de atributos e construtores. System.Text.Json também suporta de serialização e desserialização personalizadas para obter mais controle sobre como os tipos são convertidos em JSON e vice-versa. System.Text.Json não suporta o [Serializable] atributo.

Migre para System.Text.Json (JSON).

XML usando DataContractSerializer

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

Embora DataContractSerializer traga esses benefícios funcionais ao migrar do BinaryFormatter, ele não é tão moderno ou performante quanto as outras escolhas.

Migre para DataContractSerializer (XML).

Aviso

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

Binário usando MessagePack

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

Migrar para o MessagePack (binário).

Binário usando protobuf-net

A biblioteca protobuf-net é um serializador baseado em contrato para .NET que usa o formato de serialização binário Protocol Buffers. A API segue padrões .NET típicos e é 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.

Migrar para protobuf-net (binário).