CA2236: Chamar métodos da classe base em tipos ISerializable

Item Valor
RuleId CA2236
Categoria Microsoft.Usage
Alteração da falha Sem interrupção

Causa

Um tipo deriva de um tipo que implementa a interface System.Runtime.Serialization.ISerializable, e uma das seguintes condições é verdadeira:

Descrição da regra

Em um processo de serialização personalizado, um tipo implementa o método GetObjectData para serializar seus campos e o construtor de serialização para desserializar os campos. Se o tipo derivar de um tipo que implementa a interface ISerializable, o método GetObjectData do tipo base e o construtor de serialização deverão ser chamados para serializar/desserializar os campos do tipo base. Caso contrário, o tipo não será serializado e desserializado corretamente. Observe que, se o tipo derivado não adicionar novos campos, ele não precisará implementar o método GetObjectData nem o construtor de serialização, nem chamar os equivalentes de tipo base.

Como corrigir violações

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

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

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

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: 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: Construtores de serialização seguros