CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오.

속성
규칙 ID CA2237
타이틀 SerializableAttribute로 ISerializable 형식 표시
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

외부에 표시되는 형식이 System.Runtime.Serialization.ISerializable 인터페이스를 구현하고 형식이 System.SerializableAttribute 특성으로 표시되지 않습니다. 규칙은 기본 형식이 직렬화 가능하지 않은 파생 형식을 무시합니다.

규칙 설명

공용 언어 런타임에서 직렬화가 가능하다고 인식되려면 형식이 ISerializable 인터페이스 구현을 통해 사용자 지정 serialization 루틴을 사용하는 경우에도 SerializableAttribute 특성을 사용하여 형식을 표시해야 합니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 형식에 SerializableAttribute 특성을 적용합니다.

경고를 표시하지 않는 경우

애플리케이션에서 올바르게 작동하려면 직렬화할 수 있어야 하므로 예외 클래스에 대해 이 규칙의 경고를 표시하지 마세요기본.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

예시

다음 예제에서는 규칙을 위반하는 형식을 보여 줍니다. 규칙을 충족하려면 SerializableAttribute 특성 줄의 주석 처리를 제거합니다.

Imports System.Runtime.Serialization

Namespace ca2237

    ' <SerializableAttribute> _ 
    Public Class BaseType
        Implements ISerializable

        Dim baseValue As Integer

        Sub New()
            baseValue = 3
        End Sub

        Protected Sub New(
         info As SerializationInfo, context As StreamingContext)

            baseValue = info.GetInt32("baseValue")

        End Sub

        Overridable Sub GetObjectData(
         info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData

            info.AddValue("baseValue", baseValue)

        End Sub
    End Class

End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
    int baseValue;

    public BaseType()
    {
        baseValue = 3;
    }

    protected BaseType(
       SerializationInfo info, StreamingContext context)
    {
        baseValue = info.GetInt32("baseValue");
    }

    public virtual void GetObjectData(
       SerializationInfo info, StreamingContext context)
    {
        info.AddValue("baseValue", baseValue);
    }
}