CborReader ve CborWriter, varsayılan en yüksek iç içe geçme derinliğini uygular

.NET 11’den itibaren, CborReader ve CborWriter varsayılan olarak en fazla iç içe geçme derinliğini uygular. Yapılandırılan maksimum derinliği aşan CBOR verilerinin okunması veya yazılması bir özel durum oluşturur.

Sürüm kullanıma sunulmuştur

.NET 11 Önizleme 5

Önceki davranış

Daha önce, CborReader ve CborWriter için maksimum iç içe geçme derinliği sınırı yoktu. Rastgele iç içe yerleştirilmiş CBOR veri yapılarının okunması veya yazılması kısıtlama olmadan başarılı oldu.

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

Yeni davranış

.NET 11'den itibaren, CborReader, izin verilen en yüksek derinliği (varsayılan: 64) aşacak bir kapsayıcıyı (dizi, eşleme veya belirsiz uzunluklu dize) okurken CborContentException oluşturur. CborWriter, izin verilen en yüksek derinliği (varsayılan: 1000) aşacak bir kapsayıcı yazarken InvalidOperationException oluşturur.

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

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

Bu değişiklik, aşırı bellek tüketimini ve çalıştırma süresini önlemek için iç içe yerleştirme derinliğini sınırlar. İç içe geçmiş bir diziyi veya eşlemeyi atladığınızda, sistemin yapıdaki her öğeyi işlemesi gerekir ve bu da şaşırtıcı miktarda bellek kullanabilir. Bu değişiklik, Utf8JsonReader ve Utf8JsonWriter davranışıyla da tutarlıdır.

Uygulamanız varsayılan izinlerden daha derin iç içe yerleştirilmiş CBOR verilerini işliyorsa (okuma için 64 düzey, yazma için 1000 düzey), daha büyük bir sınır belirtmek için yeni seçenek türlerini kullanın:

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

Utf8JsonReader / Utf8JsonWriter aksine, CBOR’da MaxDepth = 0 olarak ayarlamak, iç içe kullanıma izin verilmez anlamına gelir ("çalışma zamanı varsayılanını kullan" değil). Çalışma zamanı varsayılanını kullanmak için, CborReaderOptions/CborWriterOptions oluşturulurken özelliği MaxDepth = -1 olarak ayarlayın veya özelliği belirtmeyin.

Önceki sınırsız derinlikli davranışı geri yüklemek için AppContext anahtarı yoktur.

Etkilenen API'ler