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 Deserialize
s_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.