CborReader a CborWriter vynucují výchozí maximální hloubku vnoření.

Od .NET 11 CborReader a CborWriter ve výchozím nastavení vynucují maximální hloubku vnoření. Čtení nebo zápis dat CBOR, která překračují nakonfigurovanou maximální hloubku, vyvolá výjimku.

Verze byla představena

.NET 11 Preview 5

Předchozí chování

Dříve CborReader a CborWriter neměly stanovený limit maximální hloubky vnoření. Čtení nebo zápis libovolných vnořených datových struktur CBOR proběhlo bez omezení.

// 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
}

Nové chování

Od .NET 11 CborReader vyvolá CborContentException při čtení kontejneru (pole, mapa nebo řetězec neurčité délky), pokud by tím byla překročena maximální povolená hloubka (výchozí hodnota: 64). CborWriter vyvolá InvalidOperationException při zápisu kontejneru, který by překročil maximální povolenou hloubku (výchozí hodnota: 1000).

// 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
}

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Tato změna omezuje hloubku vnoření, aby se zabránilo nadměrné spotřebě paměti a době provádění. Když přeskočíte hluboko vnořenou matici nebo mapu, systém musí zpracovat každý prvek ve struktuře, který může použít překvapivý objem paměti. Tato změna je také konzistentní s chováním Utf8JsonReader a Utf8JsonWriter.

Pokud vaše aplikace zpracovává data CBOR vnořená hlouběji než výchozí hodnoty umožňují (64 úrovní pro čtení, 1000 úrovní pro zápis), pomocí nových typů možností zadejte větší limit:

// 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

Na rozdíl od Utf8JsonReader/Utf8JsonWriter, nastavení MaxDepth = 0 v CBOR znamená že není povoleno žádné vnořování (ne „použít výchozí nastavení běhového prostředí“). Chcete-li použít výchozí nastavení modulu runtime, nastavte MaxDepth = -1 nebo vlastnost vynechejte při konstrukci CborReaderOptions/CborWriterOptions.

Neexistuje žádný přepínač AppContext pro obnovení předchozího chování bez omezení hloubky.

Ovlivněná rozhraní API