BinaryFormatter 장기 사용 중단 계획의 일환으로 라이브러리에서 기능을 단계적으로 제거하고 BinaryFormatter
형식의 사용을 개발자에게서 줄이고 있습니다. .NET 7부터 다음 API를 호출하면 모든 C# 및 Visual Basic 프로젝트 형식에서 컴파일 시간 오류가 발생합니다.
- DrawSubItem 이벤트
- 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 앱에서 BinaryFormatter serialization 메서드가 사용되지 않으며 금지됨(.NET 5)을 참조하세요.
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에 제공된 동작과 일치합니다. 그렇다면 원본 또는 프로젝트 파일의 SYSLIB0011
요소에서 <NoWarn>
경고를 억제해야 합니다.
<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런타임 정책은 앱 호스트에 의해 제어됩니다.
BinaryFormatter
호출은 라이브러리의 프로젝트 파일 내에서 <EnableUnsafeBinaryFormatterSerialization>
가 true
로 설정되어 있더라도 런타임 시 실패할 수 있습니다. 라이브러리는 앱 호스트의 런타임 정책을 재정의할 수 없습니다.
2Blazor 및 MAUI 런타임에서는 BinaryFormatter
호출을 금지합니다. 설정한 값과 관계없이 실행 시 호출이 실패합니다. 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