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 8 Como sugestão

Motivo

Uma instância local de é usada uma vez como argumento options de JsonSerializerOptions uma Serialize ou Deserialize chamada.

Descrição da regra

O uso de 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, já 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 de 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 , ou Deserializes_readOptions devem ser reutilizadas, s_writeOptions respectivamente.

Quando suprimir avisos

É seguro suprimir esse aviso se você souber que seu código não instanciará uma instância 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 para um arquivo, pasta ou projeto, defina sua severidade 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.