Phase 17 of 30 · Topic 17.2

Compile-Time JSON Serialization with `[JsonSerializable]`

1Concept

`JsonSerializerContext` generates type metadata and property accessors at compile time, eliminating all reflection during JSON serialization and cutting cold-start startup time by up to 80%.

2Architecture Diagram

[JsonSerializable(typeof(UserProfile))]
internal partial class AppJsonSerializerContext : JsonSerializerContext { }
       │
       ▼
Emits Fast Type Metadata Descriptors (Zero Reflection at Runtime!)

3Code Example

C# 13 & .NET 9
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

public record AccountPayload(int AccountId, string Owner, decimal Balance);

// Source Generated JSON Context
[JsonSerializable(typeof(AccountPayload))]
[JsonSourceGenerationOptions(WriteIndented = false)]
public partial class AppJsonContext : JsonSerializerContext { }

public class SourceGenJsonDemo
{
    public static void Main()
    {
        var account = new AccountPayload(8001, "Alex", 25_000m);

        // Uses compile-time generated serializer context
        string json = JsonSerializer.Serialize(account, AppJsonContext.Default.AccountPayload);
        Console.WriteLine($"Fast Serialized JSON: {json}");
    }
}

4Expected Output

Fast Serialized JSON: {"AccountId":8001,"Owner":"Alex","Balance":25000}

5Key Takeaways

  • Mandatory for Native AOT ASP.NET Core microservices.
  • Bypasses reflection metadata generation on application startup.
  • Catches missing serialization properties at compile time.