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.
Azione consigliata
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.