CborReader och CborWriter tillämpar ett maximalt kapslingsdjup som standard

Från och med .NET 11 tillämpar CborReader och CborWriter som standard ett maximalt kapslingsdjup. Att läsa eller skriva CBOR-data som överskrider det konfigurerade maximala djupet genererar ett undantag.

Version lanserad

.NET 11 Förhandsversion 5

Tidigare beteende

Tidigare hade CborReader och CborWriter ingen övre gräns för kapslingsdjupet. Läsning eller skrivning av godtyckligt nästlade CBOR-datastrukturer lyckades utan begränsningar.

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

Nytt beteende

Från och med .NET 11, CborReader genererar CborContentException när du läser en container (matris, karta eller sträng med obegränsad längd) som skulle överskrida det maximala tillåtna djupet (standard: 64). CborWriter utlöser InvalidOperationException när en container skrivs som skulle överskrida det maximala tillåtna djupet (standard: 1 000).

// 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 av brytande ändring

Den här ändringen är en beteendeförändring.

Orsak till ändring

Den här ändringen begränsar kapslingsdjupet för att förhindra överdriven minnesförbrukning och exekveringstid. När du hoppar över en djupt kapslad matris eller karta måste systemet bearbeta varje element i strukturen, vilket kan använda en överraskande mängd minne. Den här ändringen överensstämmer också med beteendet hos Utf8JsonReader och Utf8JsonWriter.

Om ditt program bearbetar CBOR-data som är kapslade djupare än standardvärdena tillåter (64 nivåer för läsning, 1 000 nivåer för skrivning) använder du de nya alternativtyperna för att ange en större gräns:

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

Till skillnad från Utf8JsonReader/Utf8JsonWriter innebär inställningen MaxDepth = 0 i CBOR att ingen nästling är tillåten (inte "använd standardvärdet för körningen"). Om du vill använda standardinställningen för körningen anger du MaxDepth = -1 eller utelämnar egenskapen när du skapar CborReaderOptions/CborWriterOptions.

Det finns ingen AppContext-växel för att återställa det tidigare beteendet med obegränsat djup.

Berörda API:er