다음을 통해 공유


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

TypeName

ImplementSerializationConstructors

CheckId

CA2229

범주

Microsoft.Usage

변경 수준

주요 변경 아님

원인

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

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

  • 형식이 unsealed이고 해당 serialization 생성자에 대한 액세스 한정자가 protected가 아닌 경우(패밀리)

  • 형식이 sealed이고 해당 serialization 생성자에 대한 액세스 한정자가 private이 아닌 경우

규칙 설명

이 규칙은 사용자 지정 serialization을 지원하는 형식과 관련이 있습니다.형식이 ISerializable 인터페이스를 구현할 경우 이 형식은 사용자 지정 serialization을 지원합니다.ISerializable.GetObjectData 메서드를 사용하여 serialize된 개체를 다시 만들거나 deserialize하려면 serialization 생성자가 필요합니다.

위반 문제를 해결하는 방법

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

경고를 표시하지 않는 경우

규칙 위반을 표시해야 합니다.형식을 deserialize할 수 없으므로 많은 시나리오에서 동작하지 않게 됩니다.

예제

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

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;

namespace UsageLibrary 
{   
    [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 = (int) info.GetValue("n1", typeof(int));
        }

        // The following method serializes the instance.
        [SecurityPermission(SecurityAction.LinkDemand, 
            Flags=SecurityPermissionFlag.SerializationFormatter)]
        void ISerializable.GetObjectData(SerializationInfo info, 
           StreamingContext context)
        {
            info.AddValue("n1", n1);
        }
    }
}

관련 규칙

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

참고 항목

참조

ISerializable

SerializationInfo

StreamingContext