BinaryFormatter serialization API에서 컴파일러 오류를 생성
BinaryFormatter 장기 사용 중단 계획의 일환으로 라이브러리에서 BinaryFormatter
기능을 계속 선별하고 개발자가 해당 형식에서 벗어나게 합니다. .NET 7을 시작으로 다음과 같은 API를 호출하면 모든 C# 및 Visual Basic 프로젝트 형식에서 컴파일 시간 오류가 발생합니다.
- System.Exception.SerializeObjectState 이벤트
- BinaryFormatter.Serialize 메서드
- BinaryFormatter.Deserialize 메서드
- Formatter.Serialize(Stream, Object) 메서드
- Formatter.Deserialize(Stream) 메서드
- IFormatter.Serialize(Stream, Object) 메서드
- IFormatter.Deserialize(Stream) 메서드
이전 동작
.NET 5 이후 영향을 받는 Serialize
및 Deserialize
메서드를 사용하면 ID가 SYSLIB0011
인 컴파일러 경고가 생성되었습니다. 자세한 내용은 ASP.NET 앱(.NET 5)에서 BinaryFormatter serialization 메서드가 사용되지 않고 금지됨을 참조하세요.
Exception.SerializeObjectState 이벤트를 사용하면 오류가 발생하지 않았습니다.
새 동작
.NET 7을 시작으로 코드에서 영향을 받는 API를 사용하면 ID가 SYSLIB0011
로 동일한 컴파일러 오류가 발생합니다. 프로젝트가 다음 조건을 모두 충족하는 경우 영향을 받습니다.
- C# 또는 Visual Basic 프로젝트인 경우
net7.0
또는 그 이상의 버전을 대상으로 하는 경우- 영향을 받는 API 중 하나를 직접 호출하는 경우
SYSLIB0011
경고 코드를 여전히 표시하는 경우
도입된 버전
.NET 7
호환성이 손상되는 변경의 형식
이 변경은 소스 호환성에 영향을 줄 수 있습니다.
변경 이유
BinaryFormatter 장기 사용 중단 계획의 일환으로 라이브러리에서 BinaryFormatter
기능을 계속 선별하고 개발자가 해당 형식에서 벗어나게 합니다.
권장 조치
가장 좋은 조치는 보안 및 안정성 결함으로 인해 BinaryFormatter
에서 마이그레이션하는 것입니다. BinaryFormatter
는 이후 릴리스에서는 .NET에서 제거할 수 있습니다. .NET 라이브러리 팀은 이미 System.Half 및 System.DateOnly와 같은 최신 형식이 BinaryFormatter
와 호환되지 않는다는 입장을 취했습니다.
오류를 표시하지 않아야 하는 경우 원래 사용되지 않는 문서의 지침에 따라 오류 표시를 없앨 수 있습니다. 오류를 다시 경고로 변환하는 프로젝트 속성을 설정하여 프로젝트 전체에서 오류를 사용하지 않도록 설정할 수도 있습니다(.NET 5/6 동작과 일치).
경고
이 속성을 설정하면 호스트 동작이 변경될 수 있습니다. EnableUnsafeBinaryFormatterSerialization< 속성>을 참조하세요.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
참고
‘경고를 오류로 처리’를 사용하도록 설정한 상태에서 프로젝트가 컴파일하는 경우 컴파일은 여전히 실패합니다. (이는 .NET 5 및 .NET 6 SDK에 제공된 동작과 일치합니다.) 이 경우 원본 또는 프로젝트 파일의 <NoWarn>
요소에서 SYSLIB0011
경고를 표시하지 않아도 됩니다.
<EnableUnsafeBinaryFormatterSerialization> 속성
<EnableUnsafeBinaryFormatterSerialization
속성은 .NET 5에서 도입되었습니다. .NET 7에서는 컴파일 및 호스트 런타임 동작을 모두 제어하도록 이 스위치의 동작이 변경되었습니다. 이 스위치의 의미는 다음 표에 설명된 대로 프로젝트 형식에 따라 다릅니다.
프로젝트 형식 | true 로 설정된 속성 |
false 로 설정된 속성 |
생략된 속성 |
---|---|---|---|
라이브러리/공유 구성 요소1 | 영향을 받는 API는 경고로 사용되지 않습니다. 애플리케이션에 대해 ‘경고를 오류로 처리’를 사용하도록 설정하거나 SYSLIB0011 경고 코드를 표시하지 않는 한 컴파일이 성공합니다. |
영향을 받는 API는 오류로 사용되지 않으며 오류가 표시되지 않는 한, 코드에서 해당 API로의 호출은 컴파일 시간에 실패합니다. | (false 의 경우와 같습니다.) |
Blazor 및 MAUI 앱2 | BinaryFormatter 에 대한 호출은 런타임에 실패합니다. |
BinaryFormatter 에 대한 호출은 런타임에 실패합니다. |
BinaryFormatter 에 대한 호출은 런타임에 실패합니다. |
ASP.NET 앱 | 영향을 받는 API는 경고로 사용되지 않습니다. 애플리케이션에 대해 ‘경고를 오류로 처리’를 사용하도록 설정하거나 SYSLIB0011 경고 코드를 표시하지 않는 한 컴파일이 성공합니다. 런타임은 코드 또는 사용하는 종속성에서 호출이 시작되는지 여부에 관계없이 BinaryFormatter 에 대한 호출을 허용합니다. |
영향을 받는 API는 오류로 사용되지 않으며 오류가 표시되지 않는 한, 코드에서 해당 API로의 호출은 컴파일 시간에 실패합니다. 런타임은 코드 또는 사용하는 종속성에서 호출이 시작되는지 여부에 관계없이 BinaryFormatter 에 대한 호출을 금지합니다. |
(false 의 경우와 같습니다.) |
데스크톱 앱 및 기타 모든 앱 유형 | 영향을 받는 API는 경고로 사용되지 않습니다. 애플리케이션에 대해 ‘경고를 오류로 처리’를 사용하도록 설정하거나 SYSLIB0011 경고 코드를 표시하지 않는 한 컴파일이 성공합니다. 런타임은 코드 또는 사용하는 종속성에서 호출이 시작되는지 여부에 관계없이 BinaryFormatter 에 대한 호출을 허용합니다. |
영향을 받는 API는 오류로 사용되지 않으며 오류가 표시되지 않는 한, 코드에서 해당 API로의 호출은 컴파일 시간에 실패합니다. 런타임은 코드 또는 사용하는 종속성에서 호출이 시작되는지 여부에 관계없이 BinaryFormatter 에 대한 호출을 금지합니다. |
영향을 받는 API는 오류로 사용되지 않으며 오류가 표시되지 않는 한, 코드에서 해당 API로의 호출은 컴파일 시간에 실패합니다. 런타임은 코드 또는 사용하는 종속성에서 호출이 시작되는지 여부에 관계없이 BinaryFormatter 에 대한 호출을 허용합니다. |
1런타임 정책은 앱 호스트에 의해 제어됩니다. <EnableUnsafeBinaryFormatterSerialization>
가 라이브러리의 프로젝트 파일 내에서 true
로 설정된 경우에도 BinaryFormatter
에 대한 호출은 런타임에 여전히 실패할 수 있습니다. 라이브러리는 앱 호스트의 런타임 정책을 재정의할 수 없습니다.
2Blazor 및 MAUI 런타임은 BinaryFormatter
에 대한 호출을 금지합니다. <EnableUnsafeBinaryFormatterSerialization>
에 대해 설정한 값에 관계없이 런타임에 호출은 실패합니다. Blazor 또는 MAUI 애플리케이션 또는 Blazor 또는 MAUI 앱에서 사용할 라이브러리에서 이러한 API를 호출하지 마세요.
영향을 받는 API
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)
참고 항목
.NET