Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Azione consigliata
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
- 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>)