Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Doporučená akce
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
- 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>)