CborReader en CborWriter dwingen een standaard maximale nestdiepte af

Vanaf .NET 11 dwingen CborReader en CborWriter standaard een maximale nestdiepte af. Het lezen of schrijven van CBOR-gegevens die de geconfigureerde maximale diepte overschrijdt, genereert een uitzondering.

Geïntroduceerde versie

.NET 11 preview 5

Vorig gedrag

Voorheen hadden CborReader en CborWriter geen maximale nestdiepte. Het lezen of schrijven van willekeurig geneste CBOR-gegevensstructuren kon zonder beperkingen plaatsvinden.

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

Nieuw gedrag

Vanaf .NET 11 genereert CborReaderCborContentException bij het lezen van een container (array, map of string met onbepaalde lengte) die de maximaal toegestane diepte (standaard: 64) zou overschrijden. CborWriter werpt InvalidOperationException tijdens het schrijven van een container die de maximaal toegestane diepte zou overschrijden (standaard: 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
}

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze wijziging beperkt de nestdiepte om overmatig geheugengebruik en uitvoeringstijd te voorkomen. Wanneer u een diep geneste matrix of kaart overslaat, moet het systeem elk element in de structuur verwerken, wat een verrassende hoeveelheid geheugen kan gebruiken. Deze wijziging is ook consistent met het gedrag van Utf8JsonReader en Utf8JsonWriter.

Als uw toepassing CBOR-gegevens verwerkt die dieper zijn genest dan de standaardinstellingen toestaan (64 niveaus voor lezen, 1000 niveaus voor schrijven), gebruikt u de nieuwe optiestypen om een grotere limiet op te geven:

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

In tegenstelling tot Utf8JsonReader/Utf8JsonWriter, instelling MaxDepth = 0 in CBOR betekent dat er geen nesten is toegestaan (niet 'de runtime-standaard gebruiken'). Als u de runtime-standaard wilt gebruiken, stelt u MaxDepth = -1 in of laat u de eigenschap weg bij het construeren van CborReaderOptions/CborWriterOptions.

Er is geen AppContext-switch om het vorige onbeperkte dieptegedrag te herstellen.

Betreffende API's