Windows Forms에 대한 BinaryFormatter 마이그레이션 가이드
BinaryFormatter 제거
.NET 9부터는 알려진 BinaryFormatter으로 인해 이(가) 더 이상 지원되지 않으며 PlatformNotSupportedException 앱을 포함하는 모든 프로젝트 형식에 대해 API가 Windows Forms을(를) 항상 throw합니다. BinaryFormatter를 참조하여 이(가) 발생시키는 위험 및 제거 이유에 대한 자세한 내용을 확인하세요.
BinaryFormatter의 제거로 인해 Windows Forms 애플리케이션이 영향을 받을 것으로 예상되며. .NET 9 이상 버전으로 마이그레이션을 완료하기 위한 조치를 취해야 합니다.
BinaryFormatter이(가) Windows Forms에게 미치는 영향
.NET 9 이전에는 리소스 저장 또는 로드와 같은 시나리오에 대한 데이터를 클립보드, 끌어서 놓기, 디자인 타임에 직렬화 및 역직렬화하는 데 Windows Forms이(가) BinaryFormatter을(를) 사용하였습니다. .NET 9부터, Windows Forms 및 WPF는 이러한 시나리오에 대해 내부적으로 BinaryFormatter 구현의 하위 집합을 사용합니다. 범용 직렬화/역직렬화에서는 BinaryFormatter에 대한 위험을 해결할 수 없지만 이러한 매우 구체적인 사용 사례의 위험을 완화하기 위한 조치가 알려진 형식 집합을 사용하여 취해졌습니다. 애플리케이션에서 마이그레이션 단계를 수행하지 않는 한 예외를 throw하는 지원되지 않거나 알 수 없는 형식에 대한 대체 BinaryFormatter 항목이 여전히 적용됩니다.
Windows Forms 및 WPF 앱은 다음과 같은 형식을 이러한 형식의 배열 및 목록과 함께 처리합니다. 마이그레이션 단계 없이 이러한 형식으로 클립보드, 끌어서 놓기 및 디자인 타임 리소스가 계속 작동합니다.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
다음과 같은 추가 형식도 Windows Forms이(가) 지원합니다.
OLE 시나리오
BinaryFormatter을 참조하여 클립보드 및 끌어서 놓기 등의 OLE 시나리오에서 제거가 미치는 영향과 마이그레이션 지침에 대한 자세한 정보를 확인하세요.
리소스(ResX)
Windows Forms 디자이너
Windows Forms Out-of-Process 디자이너는 ResX 직렬화 및 역직렬화에도 BinaryFormatter을(를) 내부적으로 사용합니다.
Windows Forms 디자이너의 표준 동작으로 인해 형식 및 속성은 실현하지 않고 직렬화에 참여 가능합니다.
BinaryFormatter이(가) 사용되는 방법 중 인식되지 못했던 한 가지는 public
에 IComponent 속성이 도입되고, 디자인 타임에 해당 속성이 채워지거나 편집되는 경우입니다. 다음과 같은 조건에서 해당 속성은 리소스 파일로 직렬화됩니다.
- 디자이너의 Form이(가) 저장될 때 공용 속성에는 데이터가 포함됩니다.
- 해당 속성은 읽기 전용이 아닙니다.
- 해당 속성은
[DesignerSerializationVisibility(false)]
(으)로 특성화되지 않습니다. - 해당 속성에는 DefaultValueAttribute이(가) 없습니다.
- 이 속성에는 CodeDOM serialization 프로세스 시
bool ShouldSerialize[PropertyName]
(이)가 반환되는 각false
메서드가 없습니다. (참고: 메서드에는private
범위가 있을 수 있습니다.) - 해당 속성은 DesignerSerializer이(가) 없는 형식입니다.
이러한 문이 참이면 디자이너는 형식 변환기가 해당 속성의 형식에 있는지 여부를 확인합니다. 그러한 경우, 디자이너는 속성 콘텐츠를 직렬화하기 위해 형식 변환기를 사용합니다. 그렇지 않으면 BinaryFormatter을(를) 콘텐츠를 리소스 파일로 직렬화하기 위해 사용합니다. Windows Forms은(는) 분석기와 코드 수정을 추가함으로써 개발자가 인식하지 못한 상태에서 BinaryFormatter 직렬화가 발생할 수 있는 이러한 유형의 동작에 대한 인식을 높이고자 했습니다.
런타임 중에 리소스 로드
이전에 BinaryFormatter을(를) 통해 리소스 파일로 직렬화된 형식은 ResX 파일의 콘텐츠가 신뢰할 수 있는 데이터로 간주되므로 BinaryFormatter이(가) 필요하지 않으며 예상대로 역직렬화됩니다. 지원되지 않는 호환성 패키지를 사용하여 다시 추가할 수 있으며, 이는 BinaryFormatter 없이는 역직렬화가 발생할 수 없기 때문입니다.
BinaryFormatter 마이그레이션 가이드: 호환성 패키지를 참조하여 자세한 내용을 확인하세요.
System.Resources.Extensions.UseBinaryFormatter
을(를) 리소스에 사용하려면 true
앱 컨텍스트 스위치를 BinaryFormatter(으)로 설정하는 추가 단계가 필요합니다.
msbuild를 통해 리소스 파일 생성
msbuild를 통해 리소스 파일을 생성할 때 런타임 중에 이진 형식의 리소스를 역직렬화 MSB3825
할 수 있음을 지정하는 오류가 발생할 BinaryFormatter 수 있습니다. 위에서 설명한 대로 이러한 리소스는 사용을 BinaryFormatter 역직렬화하지 않으며 속성을 GenerateResourceWarnOnBinaryFormatterUse
false
.로 설정하여 이 경고를 해제할 수 있습니다. 지원되지 않는 호환성 패키지를 사용하여 다시 추가할 수 있으며, 이는 BinaryFormatter없이는 역직렬화가 발생할 수 없기 때문입니다.
BinaryFormatter 마이그레이션 가이드: 호환성 패키지를 참조하여 자세한 내용을 확인하세요. 만약 System.Resources.Extensions.UseBinaryFormatter
을(를) 리소스에 사용하려면 true
앱 컨텍스트 스위치를 BinaryFormatter (으)로 설정하는 별도의 단계가 필요합니다.
BinaryFormatter(으)로부터 멀리 마이그레이션
본질적으로 처리되지 않는 형식이 직렬화 및 역직렬화 중에 영향을 받는 시나리오에서 사용되는 경우 .NET 9 이상 버전으로 마이그레이션을 완료하기 위해 조치를 취해야 합니다.
OLE 시나리오
Windows Forms 및 Windows Presentation Foundation BinaryFormatter OLE 지침을 참조하여 클립보드 및 끌어서 놓기와 같은 시나리오에서 BinaryFormatter(으)로부터 멀리 마이그레이션하는 방법에 대한 자세한 내용을 확인하세요.
디자인 타임 동안 리소스 로드 및 저장
직렬화에 참여하는 유형 또는 속성에 대해 BinaryFormatter이(가) 등록되어 있는지 확인하는 것은 ResX 시나리오의 디자이너와 같이 리소스로 직렬화되는 동안 본질적으로 처리되지 않는 유형의 경우, TypeConverter
(으)로부터 마이그레이션하는 권장 방법입니다. 이렇게 하면 직렬화 및 역직렬화를 진행하는 동안 한때 TypeConverter
이(가) 사용되었던 위치 대신 BinaryFormatter이(가) 사용됩니다.
TypeConverter
클래스를 참조하여 형식 변환기를 구현하는 방법에 대한 자세한 내용을 확인하세요.
호환성 해결 방법(권장되지 않음)
BinaryFormatter(으)로부터 마이그레이션할 수 없는 .NET 9 사용자는 지원되지 않는 호환성 패키지를 설치할 수 있습니다. BinaryFormatter마이그레이션 가이드: 호환성 패키지를 참조하여 자세한 내용을 확인하세요.
주의
BinaryFormatter은(는) 위험하며 권장되지 않는데, 이는 DoS(서비스 거부), 정보 공개 또는 원격 코드 실행 등의 공격에 소비하는 앱을 위험에 빠뜨리기 때문입니다. BinaryFormatter을 참조하여 이(가) 발생시키는 위험에 대한 자세한 내용을 확인하세요.
문제
Windows Forms 앱에서 BinaryFormatter의 직렬화 또는 역직렬화와 관련하여 예기치 않은 동작을 경험하셨다면, github.com/dotnet/winforms에 이슈를 등록하시고, 그 문제가 BinaryFormatter제거와 관련이 있음을 명시해 주세요.
.NET