Start Debugging
2023-09-17 Обновлено 2023-11-05 csharpdotnetdotnet-8 Edit on GitHub

.NET 8 как использовать JsonStringEnumConverter с native AOT

Узнайте, как использовать новый JsonStringEnumConverter<TEnum> в .NET 8 для совместимой с native AOT сериализации перечислений в System.Text.Json.

JsonStringEnumConverter несовместим с native AOT. Чтобы это исправить, в .NET 8 появился новый тип конвертера — JsonStringEnumConverter, совместимый с native AOT.

Чтобы использовать новый тип, просто пометьте свои типы так:

[JsonConverter(typeof(JsonStringEnumConverter<MyEnum>))]
public enum MyEnum { Foo, Bar }

[JsonSerializable(typeof(MyEnum))]
public partial class MyJsonSerializerContext : JsonSerializerContext { }

Имейте в виду: десериализация enum нечувствительна к регистру, а сериализацию можно настроить через JsonNamingPolicy.

Что произойдёт, если попробовать использовать JsonStringEnumConverter и NativeAOT?

Первый сигнал — на этапе компиляции, где вы получите предупреждение:

Using member ‘System.Text.Json.Serialization.JsonStringEnumConverter.JsonStringEnumConverter()’ which has ‘RequiresDynamicCodeAttribute’ can break functionality when AOT compiling. JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.

А при запуске уже скомпилированного кода — исключение времени выполнения:

System.Reflection.MissingMetadataException: ‘System.Text.Json.Serialization.Converters.EnumConverter’ is missing metadata.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад