.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 됩니다.
CborWriter 는 InvalidOperationException 허용되는 최대 깊이를 초과하는 컨테이너를 작성할 때 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
}
파괴적 변경 유형
이 변경은 동작 변경입니다.
변경 이유
이 변경은 과도한 메모리 사용 및 실행 시간을 방지하기 위해 중첩 깊이를 제한합니다. 깊이 중첩된 배열 또는 맵을 건너뛰는 경우 시스템은 구조체의 모든 요소를 처리해야 하며 이는 놀라운 양의 메모리를 사용할 수 있습니다. 이 변경 사항은 Utf8JsonReader 및 Utf8JsonWriter의 동작과도 일치합니다.
권장 작업
애플리케이션이 기본값(읽기 수준 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
- 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>)
.NET