CA1869:缓存并重用“JsonSerializerOptions”实例
属性 | 值 |
---|---|
规则 ID | CA1869 |
标题 | 缓存并重用“JsonSerializerOptions”实例 |
类别 | “性能” |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 作为建议 |
原因
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
有关详细信息,请参阅如何禁止显示代码分析警告。