CA2236: ISerializable 형식에서 기본 클래스 메서드를 호출하십시오.

항목
RuleId CA2236
범주 Microsoft.Usage
주요 변경 내용 주요 변경 아님

원인

형식이 System.Runtime.Serialization.ISerializable 인터페이스를 구현하는 형식에서 파생되며 다음 조건 중 하나에 해당합니다.

규칙 설명

사용자 지정 serialization 프로세스에서 형식은 GetObjectData 메서드를 구현하여 해당 필드를 직렬화하고 serialization 생성자를 구현하여 필드를 역직렬화합니다. 형식이 ISerializable 인터페이스를 구현하는 형식에서 파생되는 경우 기본 형식 GetObjectData 메서드와 serialization 생성자를 호출하여 기본 형식의 필드를 직렬화/역직렬화해야 합니다. 그러지 않으면 형식이 올바르게 직렬화 및 역직렬화되지 않습니다. 파생 형식이 새 필드를 추가하지 않으면 형식은 GetObjectData 메서드와 serialization 생성자를 구현하거나 기본 형식 메서드와 serialization 생성자를 호출할 필요가 없습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 해당하는 파생된 형식 메서드나 생성자에서 기본 형식 GetObjectData 메서드나 serialization 생성자를 호출합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다.

예시

다음 예제에서는 기본 클래스의 serialization 생성자와 GetObjectData 메서드를 호출하여 규칙을 충족하는 파생 형식을 보여 줍니다.

using System;
using System.Runtime.Serialization;
using System.Security.Permissions;

namespace UsageLibrary
{
   [SerializableAttribute]
   public class BaseType : ISerializable
   {
      int baseValue;

      public BaseType()
      {
         baseValue = 3;
      }

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

      [SecurityPermissionAttribute(SecurityAction.Demand, 
          SerializationFormatter = true)]
      public virtual void GetObjectData(
         SerializationInfo info, StreamingContext context)
      {
         info.AddValue("baseValue", baseValue);
      }
   }

   [SerializableAttribute]
   public class DerivedType : BaseType
   {
      int derivedValue;

      public DerivedType()
      {
         derivedValue = 4;
      }

      protected DerivedType(
         SerializationInfo info, StreamingContext context) : 
         base(info, context)
      {
         derivedValue = info.GetInt32("derivedValue");
      }

      [SecurityPermissionAttribute(SecurityAction.Demand, 
          SerializationFormatter = true)]
      public override void GetObjectData(
         SerializationInfo info, StreamingContext context)
      {
         info.AddValue("derivedValue", derivedValue);
         base.GetObjectData(info, context);
      }
   }
}

CA2240: ISerializable을 올바르게 구현하십시오.

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

CA2238: serialization 메서드를 올바르게 구현하십시오.

CA2235: 모두 serialize할 수 없는 필드로 표시하십시오.

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

CA2239: 선택적 필드에 deserialization 메서드를 제공하십시오.

CA2120: serialization 생성자를 안전하게 하십시오.