CborReader i CborWriter wymuszają domyślną maksymalną głębokość zagnieżdżania

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.

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