Поделиться через


CA1869: кэшируйте и повторно используете экземпляры JsonSerializerOptions

Свойство Значение
Идентификатор правила CA1869
Заголовок Кэширование и повторное использование экземпляров JsonSerializerOptions
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Локальный экземпляр JsonSerializerOptions используется один раз в качестве options аргумента Serialize или Deserialize вызова.

Описание правила

Использование локального экземпляра JsonSerializerOptions сериализации или десериализации может значительно снизить производительность приложения, если код выполняется несколько раз, так как System.Text.Json внутренне кэширует метаданные, связанные с сериализацией, в предоставленный экземпляр.

Устранение нарушений

Вы можете использовать единый шаблон, чтобы избежать создания нового JsonSerializerOptions экземпляра при каждом выполнении кода.

Пример

В следующем фрагменте кода показаны два нарушения 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 });
}

Следующий фрагмент кода исправляет нарушения.

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);
}

Если есть дальнейшие вызовы Serialize или Deserializes_writeOptions s_readOptions следует повторно использовать, соответственно.

Когда лучше отключить предупреждения

Это предупреждение можно отключить, если вы знаете, что код не создаст экземпляр экземпляра JsonSerializerOptions более одного раза.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1869
// The code that's violating the rule is on this line.
#pragma warning restore CA1869

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1869.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.