CA1869: armazenar em cache e reutilizar instâncias de "JsonSerializerOptions"
Property | Valor |
---|---|
ID da regra | CA1869 |
Título | Armazenar em cache e reutilizar instâncias de "JsonSerializerOptions" |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Como sugestão |
Causa
Uma instância local de JsonSerializerOptions é usada uma vez como o argumento options
de uma chamada Serialize ou Deserialize.
Descrição da regra
O uso de uma instância local de JsonSerializerOptions para serialização ou desserialização pode prejudicar substancialmente o desempenho do aplicativo se o código for executado várias vezes, já que System.Text.Json armazena internamente 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 instância de JsonSerializerOptions sempre que o código for executado.
Exemplo
O snippet de código a seguir mostra duas violações da 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 snippet 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 outras chamadas para Serialize
ou Deserialize
, s_writeOptions
ou s_readOptions
deve ser reutilizado, respectivamente.
Quando suprimir avisos
É seguro suprimir esse aviso se você souber que seu código não criará uma instância JsonSerializerOptions mais de uma vez.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1869.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.