CA1869: Armazenar em cache e reutilizar instâncias 'JsonSerializerOptions'
Property | valor |
---|---|
ID da regra | CA1869 |
Título | Armazenar em cache e reutilizar instâncias 'JsonSerializerOptions' |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
Uma instância local de JsonSerializerOptions é usada uma vez como argumento options
de uma Serialize ou Deserialize chamada.
Descrição da regra
Usar uma instância local de JsonSerializerOptions para serialização ou desserialização pode degradar substancialmente o desempenho do seu aplicativo se o código for executado várias vezes, uma vez que System.Text.Json armazena internamente em cache metadados relacionados à serialização na instância fornecida.
Como corrigir violações
Você pode usar o padrão singleton para evitar a criação de uma nova JsonSerializerOptions instância sempre que o código for executado.
Exemplo
O trecho de código a seguir mostra duas violações do 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 });
}
O trecho de código a seguir corrige as violações:
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 houver mais chamadas para Serialize
ou Deserialize
, s_writeOptions
ou s_readOptions
devem ser reutilizadas, respectivamente.
Quando suprimir avisos
É seguro suprimir esse aviso se você souber que seu código não instanciará uma instância de JsonSerializerOptions mais de uma vez.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA1869
// The code that's violating the rule is on this line.
#pragma warning restore CA1869
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1869.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.