CborReader 및 CborWriter는 기본 최대 중첩 깊이를 적용합니다.

.NET 11 CborReaderCborWriter 부터 기본적으로 최대 중첩 깊이를 적용합니다. 설정된 최대 깊이를 초과하는 CBOR 데이터를 읽거나 쓰면 예외가 발생합니다.

도입된 버전

.NET 11 미리 보기 5

이전 동작

CborReader CborWriter 이전에는 최대 중첩 깊이 제한이 없었습니다. 임의로 중첩된 CBOR 데이터 구조를 읽거나 쓰는 것은 제한 없이 성공했습니다.

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

새 동작

.NET 11 CborReader 부터 허용되는 최대 깊이(기본값: 64)를 초과하는 컨테이너(배열, 맵 또는 무한 길이 문자열)를 읽을 때 throw CborContentException 됩니다. CborWriterInvalidOperationException 허용되는 최대 깊이를 초과하는 컨테이너를 작성할 때 throw됩니다(기본값: 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
}

파괴적 변경 유형

이 변경은 동작 변경입니다.

변경 이유

이 변경은 과도한 메모리 사용 및 실행 시간을 방지하기 위해 중첩 깊이를 제한합니다. 깊이 중첩된 배열 또는 맵을 건너뛰는 경우 시스템은 구조체의 모든 요소를 처리해야 하며 이는 놀라운 양의 메모리를 사용할 수 있습니다. 이 변경 사항은 Utf8JsonReaderUtf8JsonWriter의 동작과도 일치합니다.

애플리케이션이 기본값(읽기 수준 64개, 쓰기 수준 1000개)보다 더 깊이 중첩된 CBOR 데이터를 처리하는 경우 새 옵션 유형을 사용하여 더 큰 제한을 지정합니다.

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

메모

달리 Utf8JsonReader/Utf8JsonWriter, CBOR에서 설정 MaxDepth = 0은 중첩이 허용되지 않음을 의미합니다("런타임 기본값 사용"이 아님). 런타임 기본값을 사용하려면 생성 시 속성을 설정 MaxDepth = -1 하거나 생략합니다CborReaderOptions/CborWriterOptions.

이전의 무제한 깊이 동작을 복원하는 AppContext 스위치는 없습니다.

영향을 받는 API