Nuovi overload del generatore di origine JsonSerializer

La funzionalità del generatore di origine System.Text.Json ha aggiunto nuovi overload a JsonSerializer che accettano informazioni sul tipo pregenerate tramite JsonTypeInfo<T> o JsonSerializerContext. Questi overload forniscono un'ottimizzazione delle prestazioni rispetto agli overload preesistenti che accettano istanze di JsonSerializerOptions ed eseguono la reflection in fase di esecuzione. Tutti questi tipi di parametro sono tipi riferimento per i quali è possibile passare null. L'esempio seguente illustra i modelli di firma del metodo per entrambi gli approcci:

Overload preesistenti basati su reflection/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);

Nuovi overload basati su generatore di origine/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 precedente

Era possibile scrivere codice che passava null come valore per il parametro JsonSerializerOptions e il codice veniva compilato ed eseguito correttamente.

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));

Nuovo comportamento

I nuovi metodi del generatore di origine in .NET 6 possono introdurre ambiguità del compilatore se si passa null per il parametro JsonSerializerOptions. Ad esempio, è possibile che venga visualizzato il messaggio di errore seguente:

La chiamata è ambigua tra i metodi o le proprietà seguenti: 'JsonSerializer.Serialize(TValue, JsonSerializerOptions?)' e 'JsonSerializer.Serialize(TValue, JsonTypeInfo)

Versione di introduzione

.NET 6

Tipo di modifica che causa un'interruzione

Questa modifica può influire sulla compatibilità dell'origine.

Motivo della modifica

Nuovi overload sono stati aggiunti al serializzatore come ottimizzazione delle prestazioni. Per altre informazioni, vedere Provare il nuovo generatore di origine System.Text.Json.

Aggiornare il codice in modo da evitare ambiguità con l'overload previsto, ad esempio l'esecuzione di un cast esplicito nella destinazione desiderata. È ad esempio possibile modificare l'esempio nella sezione Comportamento precedente come indicato di seguito:

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));

Altre soluzioni alternative includono:

  • Omettere il parametro facoltativo JsonSerializerOptions? options = null.
  • Usare argomenti denominati.

Non è tuttavia possibile omettere parametri facoltativi o usare argomenti denominati in un'espressione lambda.

API interessate

Tutti i metodi System.Text.Json.JsonSerializer.