Nouvelles surcharges du générateur de source JsonSerializer

La fonctionnalité System.Text.Json du générateur source a ajouté de nouvelles surcharges à JsonSerializer qui acceptent les informations de type prégénérées via JsonTypeInfo<T> ou JsonSerializerContext. Ces surcharges fournissent une optimisation du niveau de performance par rapport aux surcharges préexistantes qui prennent des instances JsonSerializerOptions et effectuent une réflexion au moment de l’exécution. Tous ces types de paramètres sont des types de référence pour lesquels vous pouvez passer null. L’exemple suivant montre les modèles de signature de méthode pour les deux approches :

Surcharges de réflexion/JsonSerializerOptionsde base préexistantes :

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

Nouvelles surcharges basées sur le générateur de source/JsonTypeInfo/JsonSerializerContext de base :

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

Comportement précédent

Vous pouvez écrire du code qui a passé null comme valeur pour le paramètreJsonSerializerOptions et qui a été compilé et exécuté avec succès.

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

Nouveau comportement

Les nouvelles méthodes du générateur source dans .NET 6 peuvent introduire une ambiguïté du compilateur si vous passez null pour le paramètre JsonSerializerOptions. Par exemple, vous pouvez recevoir le message d’erreur suivant :

L’appel est ambigu entre les méthodes ou propriétés suivantes : « JsonSerializer.Serialize(TValue, JsonSerializerOptions ?) » and « JsonSerializer.Serialize(TValue, JsonTypeInfo)

Version introduite

.NET 6

Type de changement cassant

Ce changement peut affecter la compatibilité source.

Raison du changement

De nouvelles surcharges ont été ajoutées au sérialiseur en tant qu’optimisation du niveau de performance. Pour plus d’informations, consultez Essayer le nouveau générateur source System.Text.Json.

Mettez à jour votre code de manière à lever l’ambiguïté de la surcharge prévue, par exemple en effectuant un cast explicite vers la cible prévue. Par exemple, vous pouvez modifier l’exemple dans la section Comportement précédent comme suit :

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

Voici d’autres solutions de contournement :

  • Ignorer le paramètre facultatif JsonSerializerOptions? options = null.
  • Utiliser des arguments nommés.

Toutefois, vous ne pouvez pas ignorer des paramètres facultatifs ou utiliser des arguments nommés dans une expression lambda.

API affectées

Toutes les méthodes System.Text.Json.JsonSerializer.