CborReader e CborWriter impõem uma profundidade máxima de aninhamento por defeito

A partir do .NET 11, CborReader e CborWriter impõem, por defeito, uma profundidade máxima de aninhamento. Ler ou escrever dados CBOR que excedam a profundidade máxima configurada cria uma exceção.

Versão introduzida

.NET 11 Preview 5

Comportamento anterior

Anteriormente, CborReader e CborWriter não tinha limite máximo de profundidade de aninhamento. A leitura ou escrita de estruturas de dados CBOR aninhadas arbitrariamente teve sucesso sem restrições.

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

Novo comportamento

A partir do .NET 11, CborReader lança-se CborContentException ao ler um contentor (array, mapa ou string de comprimento indefinido) que exceda a profundidade máxima permitida (padrão: 64). CborWriter gera InvalidOperationException ao escrever um contentor que exceda a profundidade máxima permitida (predefinição: 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 mudança disruptiva

Esta alteração é de natureza comportamental .

Motivo da mudança

Esta alteração limita a profundidade de aninhamento para evitar o consumo excessivo de memória e o tempo de execução. Quando se ignora um array ou mapa com vários níveis de aninhamento, o sistema tem de processar todos os elementos da estrutura, o que pode consumir uma quantidade surpreendente de memória. Esta alteração é também consistente com o comportamento de Utf8JsonReader e Utf8JsonWriter.

Se a sua aplicação processa dados CBOR aninhados mais profundamente do que os valores padrão permitem (64 níveis para leitura, 1000 níveis para escrita), use os novos tipos de opções para especificar um limite maior:

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

Ao contrário de Utf8JsonReader/Utf8JsonWriter, definir MaxDepth = 0 em CBOR significa que não é permitido qualquer aninhamento (não "usar a predefinição do tempo de execução"). Para usar o padrão em tempo de execução, defina MaxDepth = -1 ou omita a propriedade ao construirCborReaderOptions/CborWriterOptions .

Não existe um interruptor AppContext para restaurar o comportamento anterior de profundidade ilimitada.

APIs afetadas