SYSLIB0051: 레거시 직렬화 지원 API는 사용되지 않음
.NET 8부터는 다음과 같은 종류의 API가 사용되지 않습니다. 코드에서 이러한 메서드를 호출하면 컴파일 시간에 SYSLIB0051
경고가 생성됩니다.
- 패턴
.ctor(SerializationInfo, StreamingContext)
를 따르는 모든 퍼블릭 또는 보호 직렬화 생성자입니다. 이러한 생성자의 예는 Exception(SerializationInfo, StreamingContext)입니다. - ISerializable.GetObjectData(SerializationInfo, StreamingContext) 메서드의 모든 암시적 구현(예: System.Exception.GetObjectData(SerializationInfo, StreamingContext))입니다.
- IObjectReference.GetRealObject(StreamingContext) 메서드의 모든 암시적 구현(예: System.Reflection.ParameterInfo.GetRealObject(StreamingContext))입니다.
영향을 받는 API의 전체 목록은 사용되지 않는 API - SYSLIB0051을 참조하세요.
해결 방법
System.Exception에서 파생된 사용자 지정 형식을 만든 경우 실제로 직렬화할 수 있어야 하는지 여부를 고려합니다. 예외 직렬화는 주로 원격을 지원하기 위한 것이고 원격 지원은 .NET Core 1.0에서 삭제되었기 때문에 직렬화할 필요가 없을 수 있습니다.
사용자 지정 예외 형식이 다음 코드 조각에 표시된 것과 같이 정의된 경우
[Serializable]
특성, 직렬화 생성자, GetObjectData(SerializationInfo, StreamingContext) 메서드 재정의를 제거하면 됩니다.[Serializable] // Remove this attribute. public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } // Remove this constructor. protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } // Remove this method. public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }
예를 들어 API 호환성 요구 사항으로 제한되는 라이브러리를 생성하는 경우와 같이 사용자 지정 예외 형식에서 이러한 API를 제거할 수 없는 경우가 있을 수 있습니다. 이 경우 다음 코드와 같이
SYSLIB0051
진단 코드를 사용하여 고유한 직렬화 생성자 및GetObjectData
메서드를 사용하지 않는 것이 좋습니다. 직렬화 인프라 자체 외부의 누구도 이러한 API를 호출하지 않는 것이 이상적이므로 사용 중단은 사용자 지정 예외 형식을 서브클래스하는 다른 형식에만 영향을 주어야 합니다. 사용자 지정 예외 형식을 catch하거나 생성하거나 기타 방식으로 사용하는 사람에게는 바이러스성 영향을 주지 않아야 합니다.[Serializable] public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to the serialization ctor. protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to GetObjectData. public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }
.NET Framework 및 .NET 8 이상에 대한 교차 대상인 경우
#if
문을 사용하여 사용되지 않는 항목을 조건부로 적용할 수 있습니다. 이는 런타임을 교차 대상으로 지정할 때 .NET 팀이 .NET 라이브러리 코드 베이스 내에서 사용하는 것과 동일한 전략입니다.[Serializable] public class MyException : Exception { // ... #if NET8_0_OR_GREATER [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to the serialization ctor #endif protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } #if NET8_0_OR_GREATER [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to GetObjectData #endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }
특성이
[Serializable]
로 지정된 .NET 형식을 서브클래스하는 형식을 선언하고SYSLIB0051
경고를 받는 경우 이전 글머리 기호의 사용자 지정 예외 형식에 대한 지침을 따르세요.
팁
[Serializable]
사용자 지정 형식이 .NET 형식을 서브클래스하지 않으면 SYSLIB0051
경고가 표시되지 않습니다. 그러나 System.Text.Json
과 같은 최신 직렬화 라이브러리에서는 필요하지 않기 때문에 이러한 방식으로 주석을 추가하지 않는 것이 좋습니다. [Serializable]
특성 및 ISerializable
인터페이스를 제거하는 것이 좋습니다. 대신 직렬화 라이브러리를 사용하여 프라이빗 필드가 아닌 퍼블릭 속성을 통해 형식의 개체에 액세스합니다.
경고 표시 안 함
사용되지 않는 API를 사용해야 하는 경우, 코드 또는 프로젝트 파일에서 경고를 표시하지 않을 수 있습니다.
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 경고를 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
// Disable the warning.
#pragma warning disable SYSLIB0051
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0051
프로젝트에서 모든 SYSLIB0051
경고를 표시하지 않으려면 프로젝트 파일에 <NoWarn>
속성을 추가합니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
</PropertyGroup>
</Project>
자세한 내용은 경고 표시 안 함을 참조하세요.
참고 항목
.NET