Compartir a través de


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

Nombre de tipo

CallBaseClassMethodsOnISerializableTypes

Identificador de comprobación

CA2236

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

Un tipo se 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 sus campos y el constructor de la serialización para deserializar los campos.Si el tipo deriva de un tipo que implementa la interfaz ISerializable, debería llamarse al método del tipo base GetObjectData y al constructor de la serialización para serializar/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 la serialización ni llamar a los equivalentes del tipo base.

Cómo corregir infracciones

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

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El ejemplo siguiente muestra un tipo derivado que cumple la regla llamando al constructor de serialización y el método GetObjectData de la clase 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);
      }
   }
}

Reglas relacionadas

CA2240: Implementar ISerializable correctamente

CA2229: Implementar constructores de serialización

CA2238: Implementar los métodos de serialización de forma correcta

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