CA2229: 직렬화 생성자 구현

속성 값
규칙 ID CA2229
제목 serialization 생성자를 구현하십시오.
범주 사용 현황
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

주의

이 규칙은 SYSLIB0051: 레거시 serialization 지원 API가 더 이상 사용되지 않으므로 .NET 8에서 제거되었습니다.

원인

형식은 System.Runtime.Serialization.ISerializable 인터페이스를 구현하고 대리자 또는 인터페이스가 아니며 다음 조건 중 하나에 해당합니다.

  • 형식에는 SerializationInfo 개체 및 StreamingContext 개체(serialization 생성자의 시그니처)를 사용하는 생성자가 없습니다.

  • 형식이 봉인되지 않고 serialization 생성자의 액세스 한정자가 보호되지 않습니다(family).

  • 형식이 봉인되어 있고 serialization 생성자의 액세스 한정자가 private이 아닙니다.

규칙 설명

이 규칙은 사용자 지정 serialization을 지원하는 형식과 관련이 있습니다. ISerializable 인터페이스를 구현하는 형식은 사용자 정의 직렬화를 지원합니다. serialization 생성자는 ISerializable.GetObjectData 메서드를 사용하여 직렬화된 개체를 역직렬화하거나 다시 만드는 데 필요합니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 serialization 생성자를 구현합니다. 봉인 클래스의 경우에는 생성자를 private으로 만들고, 그 밖의 경우에는 protected로 만듭니다.

경고를 표시하지 않는 경우

규칙 위반을 억제하지 마십시오. 형식은 역직렬화할 수 없으며 여러 시나리오에서 작동하지 않습니다.

예시

다음 예제에서는 규칙을 충족하는 형식을 보여 줍니다.

[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
    private int n1;

    // This is a regular constructor.
    public SerializationConstructorsRequired()
    {
        n1 = -1;
    }
    // This is the serialization constructor.
    // Satisfies rule: ImplementSerializationConstructors.

    protected SerializationConstructorsRequired(
       SerializationInfo info,
       StreamingContext context)
    {
        n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
            (int)info.GetValue(nameof(n1), typeof(int))! :
            -1;
    }

    // The following method serializes the instance.
    void ISerializable.GetObjectData(SerializationInfo info,
       StreamingContext context)
    {
        info.AddValue(nameof(n1), n1);
    }
}

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

참고하기