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런타임 정책은 앱 호스트에 의해 제어됩니다. 라이브러리의 프로젝트 파일 내에서 <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