Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
À partir de .NET 11, CborReader et CborWriter imposent une profondeur d’imbrication maximale par défaut. La lecture ou l’écriture de données CBOR dont la profondeur dépasse la valeur maximale configurée entraîne une exception.
Version introduite
.NET 11 Preview 5
Comportement antérieur
Auparavant, CborReader et CborWriter n’avait pas de limite maximale de profondeur d’imbrication. La lecture ou l’écriture de structures de données CBOR imbriquées de manière arbitraire était possible sans restriction.
// 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
}
Nouveau comportement
À compter de .NET 11, CborReader lève CborContentException lors de la lecture d’un conteneur (tableau, carte ou chaîne de longueur indéfinie) qui dépasserait la profondeur maximale autorisée (valeur par défaut : 64).
CborWriter lève InvalidOperationException lors de l’écriture d’un conteneur qui dépasserait la profondeur maximale autorisée (valeur par défaut : 1 000).
// 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
}
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Cette modification limite la profondeur d’imbrication pour éviter une consommation de mémoire et un temps d’exécution excessifs. Lorsque vous passez un tableau ou un dictionnaire profondément imbriqué, le système doit traiter chaque élément de la structure, ce qui peut consommer une quantité surprenante de mémoire. Cette modification est également cohérente avec le comportement de Utf8JsonReader et Utf8JsonWriter.
Action recommandée
Si votre application traite les données CBOR imbriquées plus profondément que les valeurs par défaut (64 niveaux pour la lecture, 1000 niveaux pour l’écriture), utilisez les nouveaux types d’options pour spécifier une limite plus grande :
// 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
Contrairement à Utf8JsonReader/Utf8JsonWriter, définir MaxDepth = 0 dans CBOR signifie que aucune imbrication n’est autorisée (et non « utiliser la valeur par défaut du runtime »). Pour utiliser la valeur par défaut de l’environnement d’exécution, définissez MaxDepth = -1 ou omettez la propriété lors de la construction de CborReaderOptions/CborWriterOptions.
Il n’existe aucun commutateur AppContext pour restaurer le comportement de profondeur illimité précédent.
API affectées
- 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>)