Neue JsonSerializer-Quellgeneratorüberladungen

Im System.Text.Json-Quellgeneratorfeature wurden dem JsonSerializer neue Überladungen hinzugefügt, die vorab generierte Typinformationen über JsonTypeInfo<T> oder JsonSerializerContext akzeptieren. Diese Überladungen erzielen eine Leistungsoptimierung gegenüber bereits vorhandenen Überladungen, die JsonSerializerOptions-Instanzen akzeptieren und eine Reflexion zur Laufzeit ausführen. All diese Parametertypen sind Verweistypen, für die Sie null übergeben können. Das folgende Beispiel zeigt die Methodensignaturmuster für beide Ansätze:

Bereits vorhandene auf Reflexion/JsonSerializerOptions basierende Überladungen:

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

Neue auf dem Quellgenerator/JsonTypeInfo/JsonSerializerContext basierende Überladungen:

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

Vorheriges Verhalten

Sie konnten Code schreiben, der null als Wert für den Parameter JsonSerializerOptions übergab und erfolgreich kompiliert und ausgeführt wurde.

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

Neues Verhalten

Die neuen Quellgeneratormethoden in .NET 6 können Compilermehrdeutigkeit einführen, wenn Sie null für den Parameter JsonSerializerOptions übergeben. Beispielsweise kann folgende Fehlermeldung angezeigt werden:

Der Aufruf ist zwischen den folgenden Methoden oder Eigenschaften mehrdeutig: 'JsonSerializer.Serialize(TValue, JsonSerializerOptions?)' und 'JsonSerializer.Serialize(TValue, JsonTypeInfo)

Eingeführt in Version

.NET 6

Typ des Breaking Changes

Diese Änderung kann sich auf die Quellkompatibilität auswirken.

Grund für die Änderung

Dem Serialisierungsmodul wurden zur Leistungsoptimierung neue Überladungen hinzugefügt. Weitere Informationen finden Sie unter Testen des neuen System.Text.Json-Quellgenerators.

Aktualisieren Sie Ihren Code so, dass die beabsichtigte Überladung eindeutig ist, z. B. indem Sie eine explizite Umwandlung in das beabsichtigte Ziel durchführen. Beispielsweise können Sie das Beispiel im Abschnitt Vorheriges Verhalten wie folgt ändern:

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

Weitere Problemumgehungen:

  • Auslassen des optionalen Parameters JsonSerializerOptions? options = null.
  • Verwenden benannter Argumente.

In einem Lambdaausdruck können jedoch keine optionalen Parameter ausgelassen oder benannte Argumente verwendet werden.

Betroffene APIs

Alle System.Text.Json.JsonSerializer-Methoden.