Бөлісу құралы:


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

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

Причина

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

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

Использование локального экземпляра 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 или Deserialize, следует повторно использовать s_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

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