次の方法で共有


CA1869: 'JsonSerializerOptions' インスタンスのキャッシュおよび再利用

プロパティ
ルール ID CA1869
Title 'JsonSerializerOptions' インスタンスのキャッシュおよび再利用
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

JsonSerializerOptions のローカル インスタンスは、Serialize または Deserialize の呼び出しの options 引数として 1 回のみ使用されます。

規則の説明

シリアル化または逆シリアル化に JsonSerializerOptions のローカル インスタンスを使用すると、コードが複数回実行されたときに、アプリケーションのパフォーマンスが大幅に低下する可能性があります。これは、System.Text.Json によって、シリアル化関連のメタデータが指定されたインスタンスに内部的にキャッシュされるためです。

違反の修正方法

シングルトン パターンを使用すると、コードが実行されるたびに新しい JsonSerializerOptions インスタンスが作成されるのを防ぐことができます。

次のコード スニペットは、CA1869 の 2 つの違反を示しています。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。