Compartilhar via


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.

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.