Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
Aanbevolen actie
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
- 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>)