CborReader e CborWriter applicano una profondità di annidamento massima predefinita

A partire da .NET 11, CborReader e CborWriter impongono per impostazione predefinita una profondità massima di annidamento. La lettura o la scrittura di dati CBOR che superano la profondità massima configurata generano un'eccezione.

Versione introdotta

.NET 11 Preview 5

Comportamento precedente

In precedenza, CborReader e CborWriter non aveva un limite massimo di profondità di annidamento. La lettura o la scrittura di strutture dati CBOR annidate arbitrariamente era consentita senza limitazioni.

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

Nuovo comportamento

A partire da .NET 11, CborReader genera un'eccezione CborContentException durante la lettura di un contenitore (matrice, mappa o stringa di lunghezza indefinita) che supererebbe la profondità massima consentita (impostazione predefinita: 64). CborWriter genera InvalidOperationException quando si scrive un contenitore che supera la profondità massima consentita (impostazione predefinita: 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
}

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

Questa modifica limita la profondità di annidamento per evitare un utilizzo eccessivo della memoria e il tempo di esecuzione. Quando si salta un array o una mappa profondamente annidati, il sistema deve elaborare ogni elemento della struttura, il che può richiedere una quantità sorprendente di memoria. Questa modifica è anche coerente con il comportamento di Utf8JsonReader e Utf8JsonWriter.

Se l'applicazione elabora i dati CBOR annidati più profondamente dei valori predefiniti consentiti (64 livelli per la lettura, 1000 livelli per la scrittura), usare i nuovi tipi di opzioni per specificare un limite maggiore:

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

A differenza di Utf8JsonReader/Utf8JsonWriter, l'impostazione MaxDepth = 0 in CBOR significa che non è consentita alcuna nidificazione (non "usa il valore predefinito di runtime"). Per usare l'impostazione predefinita del runtime, impostare MaxDepth = -1 o omettere la proprietà durante la costruzione diCborReaderOptions/CborWriterOptions .

Non è disponibile alcuna opzione AppContext per ripristinare il comportamento di profondità illimitato precedente.

Le API interessate