Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
Ação recomendada
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
- 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>)