Novas sobrecargas do gerador de origem JsonSerializer
O recurso gerador de origem System.Text.Json
adicionou novas sobrecargas a JsonSerializer que aceitam informações pré-geradas sobre tipos por meio de JsonTypeInfo<T> ou JsonSerializerContext. Essas sobrecargas fornecem uma otimização de desempenho com relação às sobrecargas pré-existentes que levam instâncias JsonSerializerOptions e executam reflexão em tempo de execução. Todos esses tipos de parâmetro são tipos de referência para os quais você pode passar null
. O seguinte exemplo mostra os padrões de assinatura de método para ambas as abordagens:
Sobrecargas pré-existentes de reflexão/baseadas em JsonSerializerOptions
:
public static string JsonSerializer.Serialize<T>(T value, JsonSerializerOptions? options = null);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize<T>(string json, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize(string json, Type type, JsonSerializerOptions? options = null);
Novas sobrecargas do gerador de origem/baseadas em JsonTypeInfo
/JsonSerializerContext
:
public static string JsonSerializer.Serialize<T>(T value, JsonTypeInfo<T> jsonTypeInfo);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerContext jsonSerializerContext);
public static T JsonSerializer.Deserialize<T>(string json, JsonTypeInfo<T> jsonTypeInfo);
public static object JsonSerializer.Deserialize(string json, Type type, JsonSerializerContext jsonSerializerContext);
Comportamento anterior
Você pode escrever o código que passou null
como o valor do parâmetro JsonSerializerOptions, e ele foi compilado e executado com êxito.
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));
Novo comportamento
Os novos métodos do gerador de origem no .NET 6 podem introduzir ambiguidade do compilador se você passar null
para o parâmetro JsonSerializerOptions. Por exemplo, você pode ver a seguinte mensagem de erro:
A chamada é ambígua entre os seguintes métodos ou propriedades: "JsonSerializer.Serialize(TValue, JsonSerializerOptions?)" e "JsonSerializer.Serialize(TValue, JsonTypeInfo)"
Versão introduzida
.NET 6
Tipo de alteração interruptiva
Essa alteração pode afetar a compatibilidade da origem.
Motivo da alteração
Novas sobrecargas foram adicionadas ao serializador como uma otimização de desempenho. Para obter mais informações, confira Experimentar o novo gerador de origem System.Text.Json.
Ação recomendada
Atualize seu código de uma forma que desambigue a sobrecarga pretendida, como executar uma conversão explícita para o destino pretendido. Por exemplo, você pode alterar o exemplo na seção Comportamento anterior da seguinte maneira:
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));
Outras soluções alternativas incluem:
- Omissão do parâmetro opcional
JsonSerializerOptions? options = null
. - Usar argumentos nomeados.
No entanto, você não pode omitir parâmetros opcionais ou usar argumentos nomeados em uma expressão lambda.
APIs afetadas
Todos os métodos System.Text.Json.JsonSerializer.