Udostępnij za pośrednictwem


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ć nullwartość . W poniższym przykładzie przedstawiono wzorce sygnatur metody dla obu metod:

Wstępnie istniejące przeciążenia odbicia/JsonSerializerOptionsoparte 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/JsonSerializerContextopartego 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).

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.