Start Debugging
2023-09-17 Atualizado 2023-11-05 csharpdotnetdotnet-8 Edit on GitHub

.NET 8 como usar JsonStringEnumConverter com native AOT

Aprenda a usar o novo JsonStringEnumConverter<TEnum> no .NET 8 para serializar enums no System.Text.Json de forma compatível com native AOT.

O JsonStringEnumConverter não é compatível com native AOT. Para resolver isso, o .NET 8 traz um novo tipo de converter, JsonStringEnumConverter, que é compatível com native AOT.

Para usar o novo tipo, basta anotar seus tipos da seguinte forma:

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

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

Lembre-se: a desserialização de enums é case insensitive, enquanto a serialização pode ser customizada via JsonNamingPolicy.

O que acontece se você tentar usar JsonStringEnumConverter com NativeAOT?

O primeiro sinal aparece durante a compilação, com um aviso:

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.

Em seguida, ao executar o código compilado, você recebe uma exceção em tempo de execução:

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.

< Voltar