CA1869:缓存并重用“JsonSerializerOptions”实例

属性
规则 ID CA1869
标题 缓存并重用“JsonSerializerOptions”实例
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

JsonSerializerOptions 的本地实例被用作一次 SerializeDeserialize 调用的 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);
}

如果有对 SerializeDeserialize 的进一步调用,则应分别重用 s_writeOptionss_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

有关详细信息,请参阅如何禁止显示代码分析警告