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
или 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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.