Udostępnij za pośrednictwem


Nowe przeciążenia generatora kodu źródłowego JsonSerializer

Dodana funkcja generatora System.Text.Json źródła wprowadziła nowe przeciążenia do JsonSerializer, które akceptują wstępnie wygenerowane informacje o typie za pośrednictwem JsonTypeInfo<T> lub JsonSerializerContext. Te przeciążenia zapewniają optymalizację wydajności w porównaniu do istniejących przeciążeń, które przyjmują instancje JsonSerializerOptions i wykonują odbicie w czasie wykonywania. Wszystkie te typy parametrów to typy referencyjne, dla których można przekazać null. 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 przekazuje null jako wartość dla parametru JsonSerializerOptions, a następnie jest pomyślnie skompilowany i uruchomiony.

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 dla 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?)' oraz 'JsonSerializer.Serialize(TValue, JsonTypeInfo)

Wersja wprowadzona

.NET 6

Typ zmiany przełamującej

Ta zmiana może mieć wpływ na zgodność źródła .

Przyczyna zmiany

Nowe przeciążenia zostały dodane do serializatora w ramach 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.

Interfejsy API, których dotyczy problem

Wszystkie System.Text.Json.JsonSerializer metody.