BinaryFormatter serialization API에서 컴파일러 오류를 생성

BinaryFormatter 장기 사용 중단 계획의 일환으로 라이브러리에서 BinaryFormatter 기능을 계속 선별하고 개발자가 해당 형식에서 벗어나게 합니다. .NET 7을 시작으로 다음과 같은 API를 호출하면 모든 C# 및 Visual Basic 프로젝트 형식에서 컴파일 시간 오류가 발생합니다.

이전 동작

.NET 5 이후 영향을 받는 SerializeDeserialize 메서드를 사용하면 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.HalfSystem.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

참고 항목