다음을 통해 공유


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

TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

범주

Microsoft.Usage

변경 수준

주요 변경 아님

원인

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

규칙 설명

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

위반 문제를 해결하는 방법

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

경고를 표시하지 않는 경우

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

예제

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

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

Namespace UsageLibrary

   <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

      <SecurityPermissionAttribute(SecurityAction.Demand, _ 
          SerializationFormatter := True)> _ 
      Overridable Sub GetObjectData( _ 
         info As SerializationInfo, context As StreamingContext) _ 
         Implements ISerializable.GetObjectData

         info.AddValue("baseValue", baseValue)

      End Sub

   End Class

   <SerializableAttribute> _ 
   Public Class DerivedType: Inherits BaseType

      Dim derivedValue As Integer

      Sub New()
         derivedValue = 4
      End Sub

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

         MyBase.New(info, context)      
         derivedValue = info.GetInt32("derivedValue")

      End Sub

      <SecurityPermissionAttribute(SecurityAction.Demand, _ 
          SerializationFormatter := True)> _ 
      Overrides Sub GetObjectData( _ 
         info As SerializationInfo, context As StreamingContext)

         info.AddValue("derivedValue", derivedValue)
         MyBase.GetObjectData(info, context)

      End Sub

   End Class

End Namespace
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 생성자를 안전하게 하십시오.