Compartilhar via


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 8 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.