CborReader と CborWriter では、既定の最大入れ子深度が適用されます

.NET 11 以降では、CborReaderCborWriter既定で最大入れ子深度が適用されます。 構成された最大深度を超える CBOR データの読み取りまたは書き込みを行うと、例外が発生します。

導入されたバージョン

.NET 11 Preview 5

以前の動作

以前は、 CborReaderCborWriter には入れ子の深さの上限がありませんでした。 任意の深さにネストされた CBOR データ構造の読み書きが、制限なく可能でした。

// Deeply nested CBOR data (100 levels of nested arrays)
var reader = new CborReader(deeplyNestedBuffer);

for (int i = 0; i < 100; i++)
{
    reader.ReadStartArray(); // Succeeded at any depth
}
var writer = new CborWriter();

for (int i = 0; i < 2000; i++)
{
    writer.WriteStartArray(1); // Succeeded at any depth
}

新しい動作

.NET 11 以降、CborReaderは、許容される最大深度 (既定: 64) を超えるコンテナー (配列、マップ、または無期限の長さの文字列) を読み取るときに、CborContentExceptionをスローします。 CborWriter は、許容される最大深度 (既定値: 1000) を超えるコンテナーを書き込むときに InvalidOperationException をスローします。

// Throws CborContentException when nesting depth exceeds 64
var reader = new CborReader(deeplyNestedBuffer);

for (int i = 0; i < 65; i++)
{
    reader.ReadStartArray(); // Throws CborContentException on the 65th call
}
// Throws InvalidOperationException when nesting depth exceeds 1000
var writer = new CborWriter();

for (int i = 0; i < 1001; i++)
{
    writer.WriteStartArray(1); // Throws InvalidOperationException on the 1001st call
}

破壊的変更の種類

この変更は 動作の変更です。

変更の理由

この変更により、入れ子の深さが制限され、メモリの過剰な消費と実行時間が回避されます。 深く入れ子になった配列またはマップをスキップする場合、システムは構造体内のすべての要素を処理する必要があります。これによって、驚くほどの量のメモリが使用される可能性があります。 この変更は、 Utf8JsonReaderUtf8JsonWriterの動作とも一致します。

アプリケーションで、入れ子になった CBOR データを既定の許可より深く処理する場合 (読み取り用に 64 レベル、書き込み用に 1000 レベル)、新しいオプションの種類を使用して、より大きな制限を指定します。

// For reading CBOR data nested more than 64 levels deep
var options = new CborReaderOptions { MaxDepth = 256 };
var reader = new CborReader(data, options);
// For writing CBOR data nested more than 1000 levels deep
var writerOptions = new CborWriterOptions { MaxDepth = 2000 };
var writer = new CborWriter(writerOptions);

Note

Utf8JsonReader / Utf8JsonWriterとは異なり、CBOR でMaxDepth = 0を設定すると、入れ子は許可されません ("ランタイムの既定値を使用する" ことはできません)。 ランタイムの既定値を使用するには、 MaxDepth = -1 を設定するか、 CborReaderOptions/CborWriterOptionsを構築するときにプロパティを省略します。

前の無制限の深さの動作を復元するための AppContext スイッチはありません。

影響を受ける API