Partilhar via


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.