다음을 통해 공유


CA2229: serialization 생성자를 구현하십시오.

속성
규칙 ID CA2229
제목 serialization 생성자를 구현하십시오.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

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

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

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

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

규칙 설명

이 규칙은 사용자 지정 serialization을 지원하는 형식과 관련이 있습니다. ISerializable 인터페이스를 구현하는 경우 형식이 사용자 지정 serialization을 지원합니다. 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로 표시하십시오.

참고 항목