Сурс ген входит в жизнь дотнет разрабов всё глубже
И это не может не радовать - достойная замена псевдоИИ как никак
Одним из платформенных решений стал перенос сериализации в 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