Serialização JSON ultrarrápida com Source Generators .NET 8

Serialização JSON nunca foi tão rápida! Se você já sofreu com lentidão em APIs ou travamentos em processos de alto volume, os Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. do .NET 8 são a solução. Vamos desvendar essa feature que acelera até 5x a serialização!

📚 Conteúdo🔗

🔍 O Problema da Serialização Tradicional🔗

Antes do .NET 8, o System.Text.Json usava reflection🔍 Reflection: Inspecione Tipos em Tempo de Execução!🔍 Reflection: Inspecione Tipos em Tempo de Execução!Descubra como a Reflection em C# revoluciona a inspeção em tempo real. Aprenda a acessar e invocar membros dinamicamente com segurança. em runtime para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! gerar serializadores. Isso causava:

// Exemplo clássico (lento para muitos objetos)
var json = JsonSerializer.Serialize(pedido);

Problemas:

⚙️ Source Generators: Como Funcionam?🔗

Os Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. criam código durante a compilação específico para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! seus tipos:

[JsonSerializable(typeof(Pedido))]
public partial class AppJsonContext : JsonSerializerContext {}

Benefícios:

🛠️ Implementação Passo a Passo🔗

Passo 1: Definir contexto de serialização

using System.Text.Json.Serialization;
[JsonSerializable(typeof(Pedido))]
[JsonSerializable(typeof(List<ItemPedido>))]
public partial class AppJsonContext : JsonSerializerContext {}

Passo 2: Usar o contexto gerado

var options = new JsonSerializerOptions {
    TypeInfoResolver = AppJsonContext.Default
};
var json = JsonSerializer.Serialize(pedido, options);

📊 Benchmarks Reais🔗

Teste com 10,000 objetos complexos📊 LINQ com Objetos Complexos: Consultas que Respeitam a Hierarquia!📊 LINQ com Objetos Complexos: Consultas que Respeitam a Hierarquia!Aprenda técnicas profissionais com LINQ para navegar em estruturas hierárquicas e otimizar consultas complexas em sistemas reais de dados.:

MétodoTempo MédioAlocações
Reflection450ms15MB
Source Generator85ms2MB

Ganhos:

  • 5.3x mais rápido
  • 87% menos memória alocada

🔄 Migração de Sistemas Legados🔗

Para projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! .NET Framework 4.x:

1. Atualize para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! .NET 8+

2. Substitua Newtonsoft.Json por System.Text.Json

3. Identifique classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. críticas para conversão

4. Gere contextos específicos por módulo🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados.

Cuidado: Anotações como [JsonPropertyName] precisam ser ajustadas!

☁️ Casos de Uso na Nuvem🔗

Azure Functions⚡ Azure Functions: Serverless sem Mistérios!⚡ Azure Functions: Serverless sem Mistérios!Aprenda a criar aplicações escaláveis com Azure Functions e modelo serverless. Descubra gatilhos, bindings e melhores práticas para o seu código. (Cold Start):

[Function("ProcessarPedido")]
public static string Run([HttpTrigger] Pedido pedido)
{
    // Serialização ultra-rápida diminui tempo de resposta inicial
    return JsonSerializer.Serialize(pedido, AppJsonContext.Default.Pedido);
}

Blazor WebAssembly:

// Serialização AOT-compatible para evitar tamanho excessivo do .wasm
var dados = await HttpClient.GetFromJsonAsync<Pedido>(
    "api/pedidos/1",
    AppJsonContext.Default.Pedido
);

💣 Armadilhas Comuns🔗

1. Esquecer de incluir tipos aninhados

[JsonSerializable(typeof(Endereco))] // necessário se usado dentro de Pedido

2. Misturar contextos diferentes

// ❌ Errado
var json = JsonSerializer.Serialize(pedido, AppJsonContext.Default.Pedido);
var obj = JsonSerializer.Deserialize(json, OtherContext.Default.Pedido);

3. Não utilizar o contexto gerado corretamente

// ✅ Correto
options.TypeInfoResolver = AppJsonContext.Default;

O que são Source Generators? 🤔🔗

Os Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. são uma funcionalidade do compilador do C# que permite gerar código-fonte automaticamente durante o processo de compilação. Eles são como "geradores de código⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. em tempo real" que analisam seu código e criam novos arquivos ou trechos de código baseados nas informações disponíveis.

No contexto do System.Text.Json, os Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. são usados para criar serializadores e deserializadores altamente otimizados em tempo de compilação, evitando o uso de reflexão em tempo de execução, que é mais lento e menos eficiente.

Por que usar Source Generators no System.Text.Json? ⚡🔗

Antes dos Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build., o System.Text.Json usava reflexão em tempo de execução para serializar e deserializar objetos. Embora a reflexão seja poderosa, ela tem um custo de desempenho⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs., especialmente em cenários de alta demanda ou com grandes volumes de dados.

Com os Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build., o código de serialização é gerado em tempo de compilação, o que resulta em:

Como habilitar Source Generators no seu projeto 🛠️🔗

Para usar Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. no System.Text.Json, você precisa:

1. Adicionar📦 List<T>: Dinamismo além dos Arrays!📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. o pacote System.Text.Json (já incluso no .NET 6+).

2. Configurar o gerador de código⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. no seu projeto.

No arquivo .csproj, adicione a seguinte configuração🚀 Scale Out com Redis: Atenda Milhões de Conexões!🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real.:

<ItemGroup>
  <PackageReference Include="System.Text.Json" Version="8.0.0" />
</ItemGroup>

Agora, crie uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. de contexto para o Source Generator:

[JsonSerializable(typeof(MinhaClasse))]
public partial class JsonContext : JsonSerializerContext
{
}

Esse contexto será usado para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! gerar o código de serialização e deserialização.

Exemplo prático: Serializando e deserializando com Source Generators 🚀🔗

Vamos criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um exemplo simples para entender como funciona.

1. Defina uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. que você deseja serializar:

public class MinhaClasse
{
    public string Nome { get; set; }
    public int Idade { get; set; }
}

2. Use o contexto gerado para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! serializar e deserializar:

var objeto = new MinhaClasse { Nome = "João", Idade = 30 };
// Serialização
string json = JsonSerializer.Serialize(objeto, JsonContext.Default.MinhaClasse);
// Deserialização
var objetoDeserializado = JsonSerializer.Deserialize(json, JsonContext.Default.MinhaClasse);
Console.WriteLine(objetoDeserializado.Nome); // Saída: "João"

Note que estamos usando JsonContext.Default.MinhaClasse para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! acessar o serializador gerado automaticamente.

Vantagens e desvantagens 📊🔗

Vantagens:

Desvantagens:

Quando usar Source Generators? 🎯🔗

Use Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. quando:

Evite usar Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. se:

Conclusão 🎉🔗

Os Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. no System.Text.Json são uma adição poderosa ao ecossistema .NET, oferecendo ganhos significativos de desempenho e eficiência. Se você está desenvolvendo aplicações modernas que exigem alta performance ou compatibilidade🧠 Memory Management Avançado: Domine Span<T> e MemoryMarshal!🧠 Memory Management Avançado: Domine Span<T> e MemoryMarshal!Transforme seu código C# usando Span<T> e MemoryMarshal para manipulação eficiente de memória, reduzindo alocações desnecessárias e elevando a performance. com AOT, essa funcionalidade é um must-have.

Experimente em seus projetos e sinta a diferença no desempenho⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs. da serialização! 🚀

Considerações Finais🔗

A integração dos Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. no System.Text.Json 2.0 abre novas portas para aplicações mais rápidas e eficientes, especialmente em cenários críticos onde cada milissegundo conta. Ao gerar código em tempo de build, você elimina muitas armadilhas da reflexão e ganha em performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos! e segurança.

Essa melhoria não só facilita a vida dos desenvolvedores que já estão migrando para .NET 8+ como também prepara o terreno para projetos de alta escalabilidade📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos., onde a comunicação entre sistemas e APIs deve ser impecável.

Se você ainda não experimentou essa novidade, vale a pena explorar e testar em seus projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! – afinal, otimizar a serialização pode ser o passo que faltava para turbinar sua aplicação!

Curtiu a novidade? Então📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades., mãos à obra e aproveite o poder dos Source Generators⚡ Source Generators: Gere Código Automaticamente!⚡ Source Generators: Gere Código Automaticamente!Descubra como os Source Generators transformam seu código C#. Automatize tarefas repetitivas, melhore a performance e reduza erros durante o build. para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! transformar a forma como seu código interage com JSON.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados