Condividi tramite


CA1869: Memorizzare nella cache e riutilizzare le istanze di 'JsonSerializerOptions'

Proprietà valore
ID regola CA1869
Title Memorizzare nella cache e riutilizzare le istanze di 'JsonSerializerOptions'
Categoria Prestazioni
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitato per impostazione predefinita in .NET 9 Come suggerimento

Causa

Un'istanza locale di JsonSerializerOptions viene usata una volta come argomento di una Serialize chiamata o Deserialize .options

Descrizione regola

L'uso di un'istanza locale di JsonSerializerOptions per la serializzazione o la deserializzazione può ridurre notevolmente le prestazioni dell'applicazione se il codice viene eseguito più volte perché System.Text.Json memorizza internamente nella cache i metadati correlati alla serializzazione nell'istanza specificata.

Come correggere le violazioni

È possibile usare il modello singleton per evitare di creare una nuova JsonSerializerOptions istanza ogni volta che viene eseguito il codice.

Esempio

Il frammento di codice seguente mostra due violazioni di 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 });
}

Il frammento di codice seguente corregge le violazioni:

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

Se sono presenti altre chiamate a Serialize o Deserializes_writeOptions , o s_readOptions devono essere riutilizzate rispettivamente.

Quando eliminare gli avvisi

È possibile eliminare questo avviso in modo sicuro se si sa che il codice non creerà un'istanza jsonSerializerOptions più volte.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.