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 idiomática serialization com o serializador escolhido. Uma vez escolhido um serializador, sua documentação deve ser estudada para as melhores práticas.

Se um formato binário serialization não for um requisito, você pode considerar o uso de formatos JSON ou XML serialization . 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 serialization formatos e serializadores de código aberto sã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 influenciará sua direção e abordagem para serialization. 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 MessagePack para C# Protobuf-Net
Serialization Formato binário (NRBF) JSON 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 desserialização personalizada serialization 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 serialization modelo de programação que foi usado pelo , o BinaryFormatterque significa que ele honra o atributo e a [Serializable] implementação do 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

O MessagePack é um formato binário compacto, resultando em tamanhos de serialization 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 binário Protocol Buffersserialization . 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).