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/JsonSerializerOptions
de 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.
Action recommandée
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.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour