Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A partir do .NET 11, CborReader e CborWriter impõem uma profundidade de aninhamento máxima por padrão. Ler ou gravar dados CBOR que excedem a profundidade máxima configurada gera uma exceção.
Versão introduzida
.NET 11 Versão Prévia 5
Comportamento anterior
Anteriormente, CborReader e CborWriter não tinha limite máximo de profundidade de aninhamento. A leitura ou a gravação de estruturas de dados CBOR aninhadas arbitrariamente era bem-sucedida 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 gera CborContentException ao ler um contêiner (array, mapa ou string de comprimento indefinido) que excederia a profundidade máxima permitida (padrão: 64).
CborWriter lança InvalidOperationException ao gravar um contêiner que excederia a profundidade máxima permitida (padrã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
Essa alteração é uma mudança comportamental.
Motivo da alteração
Essa alteração limita a profundidade de aninhamento para evitar o consumo excessivo de memória e o tempo de execução. Quando você ignora uma matriz ou mapa aninhado profundamente, o sistema deve processar todos os elementos da estrutura, o que pode usar uma quantidade surpreendente de memória. Essa alteração também é consistente com o comportamento de Utf8JsonReader e Utf8JsonWriter.
Ação recomendada
Se o aplicativo processar dados CBOR aninhados mais profundamente do que os padrões permitem (64 níveis para leitura, 1.000 níveis para gravação), 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
Diferentemente de Utf8JsonReader/Utf8JsonWriter, a definição de MaxDepth = 0 em CBOR significa que nenhum aninhamento é permitido (e não "usa o padrão de runtime"). Para usar o padrão de runtime, defina MaxDepth = -1 ou omita a propriedade ao construirCborReaderOptions/CborWriterOptions .
Não há nenhuma opção AppContext para restaurar o comportamento de profundidade ilimitada anterior.
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>)