CA1869 : mise en cache et réutilisation des instances de 'JsonSerializerOptions'

Propriété Value
Identificateur de la règle CA1869
Titre Mettre en cache et réutiliser les instances 'JsonSerializerOptions'
Catégorie Performances
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Comme suggestion

Cause

Une instance locale de JsonSerializerOptions est utilisée une fois comme argument options d’un appel Serialize ou Deserialize.

Description de la règle

L’utilisation d’une instance locale de JsonSerializerOptions pour la sérialisation ou la désérialisation peut considérablement dégrader le niveau de performance de votre application si votre code s’exécute plusieurs fois, car System.Text.Json met en cache en interne les métadonnées liées à la sérialisation dans l’instance fournie.

Comment corriger les violations

Vous pouvez utiliser le modèle singleton pour éviter de créer une instance de JsonSerializerOptions chaque fois que votre code est exécuté.

Exemple

L’extrait de code suivant montre deux violations de CA1869 :

static string Serialize<T>(T value)
{
    JsonSerializerOptions jsonOptions = new()
    {
        WriteIndented = true
    };

    return JsonSerializer.Serialize(value, jsonOptions);
}

static T Deserialize<T>(string json)
{
    return JsonSerializer.Deserialize<T>(json, new JsonSerializerOptions { AllowTrailingCommas = true });
}

L’extrait de code suivant corrige les violations :

private static readonly JsonSerializerOptions s_writeOptions = new()
{
    WriteIndented = true
};

private static readonly JsonSerializerOptions s_readOptions = new()
{
    AllowTrailingCommas = true
};

static string Serialize<T>(T value)
{
    return JsonSerializer.Serialize(value, s_writeOptions);
}

static T Deserialize<T>(string json)
{
    return JsonSerializer.Deserialize<T>(json, s_readOptions);
}

S’il existe d’autres appels à Serialize ou Deserialize, s_writeOptions ou s_readOptions doivent être réutilisés, respectivement.

Quand supprimer les avertissements

Il est sécuritaire de supprimer cet avertissement si vous savez que votre code n’instancie pas une instance JsonSerializerOptions plusieurs fois.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA1869
// The code that's violating the rule is on this line.
#pragma warning restore CA1869

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA1869.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.