Partilhar via


CA2236: chamar métodos de classe base em tipos ISerializable

TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um tipo é derivado de um tipo que implementa a interface de ISerializable , e uma das seguintes condições for verdadeira:

Descrição da Regra

Em um processo de serialização personalizada, um tipo implementa o método de GetObjectData para serializar seus campos e o construtor de serialização MDS para serializar os campos.Se o tipo se deriva de um tipo que implementa a interface de ISerializable , o construtor do método e de serialização do GetObjectData do tipo de base deve ser chamado a serialize/de-serialize os campos de tipo base.Caso contrário, o tipo não será serializado e o MDS não será serializado corretamente.Observe que se o tipo derivado não adiciona os novos campos, o tipo não precisa implementar o método de GetObjectData nem o construtor de serialização ou de chamar os equivalentes do tipo de base.

Como Corrigir Violações

Para corrigir uma violação desta regra, chame o método ou do construtor de serialização do GetObjectData do tipo de base do método correspondentes derivado do tipo ou o construtor.

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra um tipo derivado que satisfaça a regra chamando o método do construtor e de GetObjectData de serialização da classe base.

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);
      }
   }
}

Regras Relacionadas

CA2240: implementar ISerializable corretamente

CA2229: implementar construtores de serialização

CA2238: implementar métodos de serialização corretamente

CA2235: marcar todos os campos não serializáveis

CA2237: marcar tipos ISerializable com SerializableAttribute

CA2239: fornecer métodos de desserialização para campos opcionais

CA2120: proteger construtores de serialização