TGViewer
StepOne | Степан Минин StepOne | Степан Минин @steponeit · 3.27K subscribers
Post #424 2.95K
System.Text.Json | Source Generator

Сурс ген входит в жизнь дотнет разрабов всё глубже

И это не может не радовать - достойная замена псевдоИИ как никак

Одним из платформенных решений стал перенос сериализации в compile-time, что ofc должно бустануть перф

Во-первых, в .csproj прописываем
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>


Во-вторых, пилим partial наследника JsonSerializerContext, где указываем какие типы надо поддержать, например:
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization)]
[JsonSerializable(typeof(List<object>))]
[JsonSerializable(typeof(Dictionary<string, object>))]
[JsonSerializable(typeof(bool))]
[JsonSerializable(typeof(double))]
[JsonSerializable(typeof(string))]
private partial class AsStringSerializationContext : JsonSerializerContext;


Что здесь super tricky и не очевидно, то это настройка и передача опций


Часть можно передать в атрибут [JsonSourceGenerationOptions], но он не поддерживает работу с циклическими ссылками в том числе

Оказывается, можно просто создать экземпляр контекста руками и не париться:
private static readonly AsStringSerializationContext AsStringJsonContext = new(new JsonSerializerOptions
{
WriteIndented = true,
ReferenceHandler = ReferenceHandler.IgnoreCycles,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals
});


Ах да, к чему это я всё? Если хотите AOT, то сериализация должна быть на сурс гене)
В результате перевода hydrascript на сурс ген жсон получился такой PR:
https://github.com/Stepami/hydrascript/pull/80/files
GitHub Перевод на Source Gen Json by Stepami · Pull Request #80 · Stepami/hydrascript Description В рамках PR пытался перевести проект на AOT Publish Оказалось, что это невозможно В процессе оказалось, что для того чтобы прогнать dotnet publish -p:PublishAot=true Необходимо перевес...
  • 🔥 10
  • 👍 6
  • ❤‍🔥 1
More from @steponeit
  1. Sep 25, 2026Рассказал как я добавил в HydraScript объекты и методы без классов и сделал протоколы. Стр…
  2. Sep 22, 2026Post #858
  3. Sep 21, 2026Post #857
  4. Sep 15, 2026Напомню, что у меня есть WireMock.Grpc.Protobuf — расширение для тех, кто пишет компонентн…
  5. Sep 12, 2026StepOne — официальный контрибутор FusionCache 🤙 Между набросами можно ещё и код писать Fu…
  6. Sep 11, 2026Стояк работодателей 2026 🤫 Оказывается, год назад я предсказал выход Астры! И вместе с эт…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →