CodeGym /Cursos /C# SELF /Visão geral das classes padrão de serialização no .NET

Visão geral das classes padrão de serialização no .NET

C# SELF
Nível 44 , Lição 0
Disponível

1. Introdução

Já que decidimos "desmontar a minifigura de LEGO em peças", vamos entender quais ferramentas temos no .NET para isso. Ou seja — quais classes padrão ajudam a serializar e desserializar objetos em vários formatos e o que existe por trás de cada uma.

Como é organizado o ecossistema de serialização do .NET

No momento atual (2025) o .NET oferece alguns enfoques principais para serialização, cada um com seu conjunto de classes e ferramentas. Os principais e mais comuns:

  • Serialização JSON — a opção principal e mais moderna, usada na maioria dos projetos.
  • Serialização XML — um pouco mais antiquada, mas ainda muito usada.
  • Serialização binária — só para casos especiais e normalmente via soluções modernas de terceiros.

Muitos exemplos e a maior parte do código em .NET 9 usam justamente JSON, e isso não é moda — é o padrão da indústria. Mas o .NET também suporta outras opções — por precaução.

Os protagonistas da serialização no .NET

Formato Classe de serialização Simplicidade Performance Segurança Atualidade
JSON
System.Text.Json
🔥🔥🔥 🔥🔥🔥 🔥🔥🔥 A mais atual
XML
System.Xml.Serialization.XmlSerializer
🔥🔥 🔥🔥 🔥🔥 Usada
JSON Newtonsoft.Json (Json.NET) 🔥🔥🔥 🔥🔥 🔥🔥🔥 Muito popular

Breve descrição de cada um

  • System.Text.Json: Novo padrão para serialização JSON no .NET, apareceu no .NET Core 3.0, virou padrão no .NET 5+. Rápido, leve, seguro, vem "out of the box" no .NET 9. Documentação
  • XmlSerializer: Alternativa antiga e testada para serializar em XML. Fácil de usar, mas com limitações (por exemplo, precisa de classe public e propriedades públicas). Bom para compatibilidade e contratos de dados rígidos. Documentação
  • Newtonsoft.Json: Durante muito tempo foi o padrão de fato para JSON até o surgimento do System.Text.Json. Usado frequentemente para cenários complexos (dinâmica, propriedades privadas etc.). Documentação

Cadê o BinaryFormatter?

Se você encontrar na internet instruções para usar BinaryFormatter — provavelmente é um tutorial antigo. Não use BinaryFormatter: ele foi removido do .NET 9 por questões de segurança. A serialização binária moderna fica por conta de soluções de terceiros — por exemplo, Protobuf ou MessagePack.

2. Exemplos simples

Vamos aplicar na prática serialização e desserialização usando nosso já conhecido exemplo da classe Player do universo de jogos.

Preparemos a classe para serializar

// Player.cs
public class Player
{
    public string Name { get; set; }
    public int Health { get; set; }
    public bool IsAlive { get; set; }
    public List<string> Inventory { get; set; }
    public Position Position { get; set; }
}

public class Position
{
    public int X { get; set; }
    public int Y { get; set; }
}

a) Serialização e desserialização em JSON com System.Text.Json

using System.Text.Json;

Player aragorn = new Player
{
    Name = "Aragorn",
    Health = 100,
    IsAlive = true,
    Inventory = new List<string> { "sword", "bow", "healing potion" },
    Position = new Position { X = 10, Y = 25 }
};

// Serializa o objeto Player para uma string JSON
string json = JsonSerializer.Serialize(aragorn);
// Mostra o JSON na tela
Console.WriteLine(json);

// Desserializa a string JSON de volta para um objeto Player
Player? aragornClone = JsonSerializer.Deserialize<Player>(json);
// Vamos checar se o clone funciona :)
Console.WriteLine(aragornClone?.Name); // Deve imprimir "Aragorn"

Viu como é simples — sem "danças com chocalho" e sem atributos mágicos. Agora — como fica em XML.

b) Serialização e desserialização em XML com XmlSerializer

using System.Xml.Serialization;

// Preparamos o serializer para a classe Player
XmlSerializer serializer = new XmlSerializer(typeof(Player));

// Serialização para arquivo
using FileStream fs = new FileStream("aragorn.xml", FileMode.Create);
serializer.Serialize(fs, aragorn); // Salvamos Aragorn no arquivo XML

// Desserialização do arquivo
using FileStream fs = new FileStream("aragorn.xml", FileMode.Open);
Player aragornFromXml = (Player) serializer.Deserialize(fs)!;
Console.WriteLine(aragornFromXml.Name); // Deve imprimir "Aragorn"

Atenção! XmlSerializer exige que classes e suas propriedades sejam públicas e tenham um construtor padrão sem parâmetros (se você sobrescrever o construtor — faça um public sem parâmetros). Caso contrário a serialização vai falhar.

c) Serialização e desserialização em JSON com Newtonsoft.Json

using Newtonsoft.Json; // Não esqueça de adicionar o pacote Newtonsoft.Json via NuGet!

// Serialização
string json2 = JsonConvert.SerializeObject(aragorn);

// Desserialização
Player? aragornFromNewtonsoft = JsonConvert.DeserializeObject<Player>(json2);

Console.WriteLine(aragornFromNewtonsoft?.Name); // De novo "Aragorn"

Parece quase igual, mas o Newtonsoft.Json tem muitas opções extras — por exemplo, dá pra serializar campos privados, customizar formatação e resolver cenários não triviais.

4. Nuances úteis

Serializadores padrão e o que eles conseguem

Classe Formato Incluído no .NET Precisa de pacote NuGet? Bom para arquivos Bom para API Simplicidade
System.Text.Json
JSON Sim Não Sim Sim Leve
Newtonsoft.Json
JSON Não Sim Sim Sim Leve
XmlSerializer
XML Sim Não Sim Freq. Leve

Como escolher qual usar?

Se você não sabe por que precisaria de XML — quase sempre escolha JSON e System.Text.Json. É mais rápido, mais simples e segue práticas modernas.

XML faz sentido quando:

  • Você integra com sistemas legados que exigem explicitamente XML.
  • Precisa de um esquema rígido e validação da estrutura de dados.
  • As estruturas são grandes, estáveis e a compatibilidade formal importa (configs, troca com sistemas enterprise).

JSON — quando:

  • Você está criando uma aplicação moderna, falando com web e mobile.
  • Quer simplicidade, legibilidade e compactação.
  • Não quer puxar dependências extras.

Newtonsoft.Json — quando:

  • Precisa serializar campos privados, customizações especiais, flexibilidade completa.
  • Ou o projeto já usa essa biblioteca e migrar não é viável agora.

5. Erros típicos e armadilhas

Codificação. As classes de serialização padrão (especialmente ao trabalhar com arquivos) usam UTF-8 por padrão. Se aparecerem "caracteres estranhos", verifique como você está lendo/escrevendo os arquivos e se a codificação foi explicitamente definida. Documentação sobre configuração de encoding.

Tipos não suportados. Alguns serializadores padrão (principalmente XML) não conseguem serializar, por exemplo, dicionários (Dictionary), campos privados/protected, events, delegates e interfaces. Normalmente são suportadas classes públicas com propriedades simples públicas.

Versões das classes. Se você mudar a estrutura de uma classe (adicionar/renomear/remover propriedades), dados antigos podem não ser lidos ou desserializados incorretamente. Planeje versionamento de formato.

Valores null. Ao desserializar, se algum campo estiver ausente nos dados, a propriedade correspondente vai receber o valor padrão (para tipos de referência — null). Lembre-se de checar isso.

Atributos. Para ajustes finos costuma-se usar atributos como [JsonIgnore], [XmlElement] etc. Eles permitem excluir propriedades, alterar nomes de elementos e controlar o formato — detalhes nas próximas aulas.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION