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
/JsonSerializerContext
založ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.
Doporučená akce
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.