CA2236: Llamar a métodos de clase base en tipos ISerializable

Elemento Valor
RuleId CA2236
Category Microsoft.Usage
Cambio importante Poco problemático

Causa

Un tipo deriva de un tipo que implementa la interfaz System.Runtime.Serialization.ISerializable y se cumple una de las condiciones siguientes:

Descripción de la regla

En un proceso de serialización personalizado, un tipo implementa el método GetObjectData para serializar los campos y el constructor de serialización para des serializar los campos. Si el tipo deriva de un tipo que implementa la interfaz ISerializable, se debe llamar al método GetObjectData de tipo base y al constructor de serialización para serializar o deserializar los campos del tipo base. De lo contrario, el tipo no se serializará ni se deserializará correctamente. Tenga en cuenta que si el tipo derivado no agrega ningún campo nuevo, el tipo no necesita implementar el método GetObjectData ni el constructor de serialización ni tampoco llamar a los equivalentes de tipo base.

Cómo corregir infracciones

Para corregir una infracción de esta regla, llame al método de tipo base GetObjectData o al constructor de serialización desde el constructor o el método de tipo derivado correspondiente.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo

En el ejemplo siguiente se muestra un tipo derivado que satisface la regla llamando al constructor de serialización y al método GetObjectData de la clase 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 correctamente

CA2229: Implementar constructores de serialización

CA2238: Implementar métodos de serialización correctamente

CA2235: Marcar todos los campos no serializables

CA2237: Marcar los tipos ISerializable con SerializableAttribute

CA2239: Proporcionar métodos de deserialización para campos opcionales

CA2120: Proteger los constructores de serializaciones