Sdílet prostřednictvím


Nová přetížení generátoru zdrojů JsonSerializer

Funkce System.Text.Json generátoru zdroje přidala nová přetížení JsonSerializer , která přijímají předem generované informace o typu prostřednictvím JsonTypeInfo<T> nebo JsonSerializerContext. Tato přetížení poskytují optimalizaci výkonu před existujícími přetíženími, která přebírá JsonSerializerOptions instance a provádí reflexi za běhu. Všechny tyto typy parametrů jsou referenční typy, pro které můžete předat null. Následující příklad ukazuje vzory podpisů metod pro oba přístupy:

Před existujícími přetíženími reflexe neboJsonSerializerOptions založenými na základech:

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);

Nová přetížení generátoru/JsonTypeInfo/JsonSerializerContextzaložené na zdroji:

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);

Předchozí chování

Můžete napsat kód, který se předal null jako hodnota parametru JsonSerializerOptions , a zkompiloval a úspěšně běžel.

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

Nové chování

Nové metody generátoru zdrojového kódu v .NET 6 mohou při předání null parametru zavést nejednoznačnost kompilátoru JsonSerializerOptions . Může se například zobrazit následující chybová zpráva:

Volání je nejednoznačné mezi následujícími metodami nebo vlastnostmi: JsonSerializer.Serialize(TValue, JsonSerializerOptions?) a JsonSerializer.Serialize(TValue, JsonTypeInfo)

Zavedená verze

.NET 6

Typ zásadní změny

Tato změna může mít vliv na kompatibilitu zdroje.

Důvod změny

Do serializátoru byly přidány nové přetížení jako optimalizace výkonu. Další informace najdete v tématu Vyzkoušení nového generátoru zdroje System.Text.Json.

Aktualizujte kód způsobem, který nejednoznačným způsobem přetíží, například provedení explicitního přetypování na zamýšlený cíl. Příklad v předchozí části chování můžete například změnit takto:

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

Mezi další alternativní řešení patří:

  • Vynechání volitelného parametru JsonSerializerOptions? options = null.
  • Použití pojmenovaných argumentů

Nemůžete však vynechat volitelné parametry ani v výrazu lambda použít pojmenované argumenty.

Ovlivněná rozhraní API

System.Text.Json.JsonSerializer Všechny metody.