Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od platformy .NET 11 elementy CborReader i CborWriter domyślnie wymuszają maksymalną głębokość zagnieżdżenia. Odczytywanie lub zapisywanie danych CBOR o głębokości przekraczającej skonfigurowaną wartość maksymalną powoduje zgłoszenie wyjątku.
Wersja wprowadzona
.NET 11 (wersja zapoznawcza 5)
Poprzednie zachowanie
Wcześniej CborReader i CborWriter nie miały maksymalnego poziomu zagnieżdżenia. Odczytywanie lub zapisywanie dowolnie zagnieżdżonych struktur danych CBOR było możliwe bez ograniczeń.
// 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
}
Nowe zachowanie
Począwszy od .NET 11, CborReader zgłaszany CborContentException podczas odczytywania kontenera (tablica, mapa lub ciąg o nieskończonej długości), który przekroczy maksymalną dozwoloną głębokość (wartość domyślna: 64).
CborWriter
InvalidOperationException zgłasza wyjątek podczas zapisywania kontenera, którego głębokość przekroczyłaby maksymalną dozwoloną głębokość (domyślnie: 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
}
Typ zmiany przełamującej
Ta zmiana jest zmianą behawioralną.
Przyczyna zmiany
Ta zmiana ogranicza głębokość zagnieżdżania, aby zapobiec nadmiernemu użyciu pamięci i czasowi wykonywania. W przypadku pomijania głęboko zagnieżdżonej tablicy lub mapy system musi przetwarzać każdy element w strukturze, co może używać zaskakującej ilości pamięci. Ta zmiana jest również zgodna z zachowaniem Utf8JsonReader i Utf8JsonWriter.
Zalecana akcja
Jeśli aplikacja przetwarza dane CBOR zagnieżdżone głębiej niż wartości domyślne (64 poziomy odczytu, 1000 poziomów zapisu), użyj nowych typów opcji, aby określić większy limit:
// 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
W przeciwieństwie do Utf8JsonReader/Utf8JsonWriter, ustawienie MaxDepth = 0 w CBOR oznacza, że zagnieżdżanie nie jest dozwolone (a nie „użyj domyślnej wartości środowiska uruchomieniowego”). Aby użyć domyślnego środowiska uruchomieniowego, ustaw MaxDepth = -1 lub pomiń właściwość podczas konstruowaniaCborReaderOptions/CborWriterOptions .
Nie ma przełącznika AppContext pozwalającego przywrócić wcześniejsze zachowanie polegające na braku ograniczenia głębokości.
Interfejsy API, których dotyczy problem
- 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>)