CborReader y CborWriter aplican una profundidad de anidamiento máxima predeterminada

A partir de .NET 11, CborReader y CborWriter imponen una profundidad máxima de anidamiento de forma predeterminada. Leer o escribir datos de CBOR que superen la profundidad máxima configurada produce una excepción.

Versión introducida

.NET 11 Preview 5

Comportamiento anterior

Anteriormente, CborReader y CborWriter no tenía ningún límite máximo de profundidad de anidamiento. La lectura o escritura de estructuras de datos CBOR anidadas arbitrariamente se podía realizar sin ninguna restricción.

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

Nuevo comportamiento

A partir de .NET 11, CborReader produce CborContentException al leer un contenedor (matriz, mapa o cadena de longitud indefinida) que superaría la profundidad máxima permitida (valor predeterminado: 64). CborWriter produce InvalidOperationException al escribir un contenedor que superaría la profundidad máxima permitida (valor predeterminado: 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 de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio limita la profundidad de anidamiento para evitar un consumo excesivo de memoria y tiempo de ejecución. Al omitir una matriz o un mapa profundamente anidados, el sistema debe procesar todos los elementos de la estructura, lo que puede usar una cantidad sorprendente de memoria. Este cambio también es coherente con el comportamiento de Utf8JsonReader y Utf8JsonWriter.

Si la aplicación procesa datos de CBOR anidados más profundamente que los valores predeterminados permiten (64 niveles para leer, 1000 niveles para escribir), use los nuevos tipos de opciones para especificar un límite mayor:

// 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 diferencia de Utf8JsonReader/Utf8JsonWriter, establecer MaxDepth = 0 en CBOR significa que no se permite el anidamiento (no «usar el valor predeterminado del entorno de ejecución»). Para usar el valor predeterminado del entorno de ejecución, establezca MaxDepth = -1 o omita la propiedad al construirCborReaderOptions/CborWriterOptions .

No existe ningún conmutador de AppContext que restaure el comportamiento anterior de profundidad ilimitada.

Las APIs afectadas