.NET 11 以降では、CborReaderとCborWriter既定で最大入れ子深度が適用されます。 構成された最大深度を超える CBOR データの読み取りまたは書き込みを行うと、例外が発生します。
導入されたバージョン
.NET 11 Preview 5
以前の動作
以前は、 CborReader と CborWriter には入れ子の深さの上限がありませんでした。 任意の深さにネストされた 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
}
破壊的変更の種類
この変更は 動作の変更です。
変更の理由
この変更により、入れ子の深さが制限され、メモリの過剰な消費と実行時間が回避されます。 深く入れ子になった配列またはマップをスキップする場合、システムは構造体内のすべての要素を処理する必要があります。これによって、驚くほどの量のメモリが使用される可能性があります。 この変更は、 Utf8JsonReader と Utf8JsonWriterの動作とも一致します。
推奨されるアクション
アプリケーションで、入れ子になった 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
- System.Formats.Cbor.CborReader.ReadStartArray()
- System.Formats.Cbor.CborReader.ReadStartMap()
- System.Formats.Cbor.CborReader.ReadStartIndefiniteLengthByteString()
- System.Formats.Cbor.CborReader.ReadStartIndefiniteLengthTextString()
- CborWriter.WriteStartArray(Nullable<Int32>)
- System.Formats.Cbor.CborWriter.WriteStartIndefiniteLengthByteString()
- System.Formats.Cbor.CborWriter.WriteStartIndefiniteLengthTextString()
- System.Formats.Cbor.CborWriter.WriteStartMap(Nullable<Int32>)
.NET