CborReader dan CborWriter menerapkan kedalaman penyarangan maksimum bawaan

Mulai dari .NET 11, CborReader dan CborWriter memberlakukan kedalaman penumpukan maksimum secara default. Membaca atau menulis data CBOR yang melebihi batas kedalaman maksimum yang dikonfigurasi akan memunculkan pengecualian.

Versi yang diperkenalkan

.NET 11 Pratinjau 5

Perilaku sebelumnya

Sebelumnya, CborReader dan CborWriter tidak memiliki batas kedalaman bersarang maksimum. Pembacaan atau penulisan struktur data CBOR yang disarangkan secara arbitrer dapat dilakukan tanpa batasan.

// 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
}

Perilaku baru

Mulai dari .NET 11, CborReader melempar CborContentException saat membaca kontainer (array, peta, atau string panjang tidak terbatas) yang akan melebihi kedalaman maksimum yang diizinkan (default: 64). CborWriter melempar InvalidOperationException saat menulis kontainer yang akan melebihi kedalaman maksimum yang diizinkan (default: 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
}

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku.

Alasan perubahan

Perubahan ini membatasi kedalaman penyarangan untuk mencegah konsumsi memori dan waktu eksekusi yang berlebihan. Ketika Anda melewati array atau peta yang sangat berlapis, sistem harus memproses setiap elemen dalam struktur, yang dapat menggunakan jumlah memori yang mengejutkan. Perubahan ini juga konsisten dengan perilaku Utf8JsonReader dan Utf8JsonWriter.

Jika aplikasi Anda memproses data CBOR yang berlapis lebih dalam dari default yang diizinkan (64 tingkat untuk membaca, 1000 tingkat untuk menulis), gunakan jenis opsi baru untuk menentukan batas yang lebih besar:

// 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

Tidak seperti Utf8JsonReader/Utf8JsonWriter, menetapkan MaxDepth = 0 di CBOR berarti penyarangan tidak diizinkan (bukan "gunakan nilai bawaan runtime"). Untuk menggunakan default runtime, atur MaxDepth = -1 atau hilangkan properti saat membuatCborReaderOptions/CborWriterOptions .

Tidak ada sakelar AppContext untuk memulihkan perilaku kedalaman tak terbatas sebelumnya.

API yang Terpengaruh