Nowe przeciążenia generatora źródła JsonSerializer
Funkcja generatora System.Text.Json
źródła dodała nowe przeciążenia, które JsonSerializer akceptują wstępnie wygenerowane informacje o typie za pośrednictwem metody JsonTypeInfo<T> lub JsonSerializerContext. Te przeciążenia zapewniają optymalizację wydajności w przypadku istniejących przeciążeń, które przyjmują JsonSerializerOptions wystąpienia i wykonują odbicie w czasie wykonywania. Wszystkie te typy parametrów to typy referencyjne, dla których można przekazać null
wartość . W poniższym przykładzie przedstawiono wzorce sygnatur metody dla obu metod:
Wstępnie istniejące przeciążenia odbicia/JsonSerializerOptions
oparte na:
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);
Nowe przeciążenia generatora/JsonTypeInfo
/JsonSerializerContext
opartego na źródle:
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);
Poprzednie zachowanie
Możesz napisać kod, który został przekazany jako wartość parametruJsonSerializerOptions, a następnie skompilowany null
i uruchomiony pomyślnie.
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));
Nowe zachowanie
Nowe metody generatora źródła na platformie .NET 6 mogą wprowadzać niejednoznaczność kompilatora w przypadku przekazania null
parametru JsonSerializerOptions . Na przykład może zostać wyświetlony następujący komunikat o błędzie:
Wywołanie jest niejednoznaczne między następującymi metodami lub właściwościami: "JsonSerializer.Serialize(TValue, JsonSerializerOptions?)" and 'JsonSerializer.Serialize(TValue, JsonTypeInfo)
Wprowadzona wersja
.NET 6
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność źródła.
Przyczyna wprowadzenia zmiany
Nowe przeciążenia zostały dodane do serializatora jako optymalizacji wydajności. Aby uzyskać więcej informacji, zobacz Try the new System.Text.Json source generator (Wypróbuj nowy generator źródła System.Text.Json).
Zalecana akcja
Zaktualizuj kod w taki sposób, aby rozbroić zamierzone przeciążenie, takie jak wykonywanie jawnego rzutowania na zamierzony cel. Na przykład możesz zmienić przykład w sekcji Poprzednie zachowanie w następujący sposób:
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));
Inne obejścia obejmują:
- Pominięcie opcjonalnego parametru
JsonSerializerOptions? options = null
. - Używanie nazwanych argumentów.
Nie można jednak pominąć parametrów opcjonalnych ani użyć nazwanych argumentów w wyrażeniu lambda.
Dotyczy interfejsów API
System.Text.Json.JsonSerializer Wszystkie metody.