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.
Empfohlene Maßnahme
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.