CA2236 : Appelez les méthodes de la classe de base sur les types ISerializableCA2236: Call base class methods on ISerializable types

TypeNameTypeName CallBaseClassMethodsOnISerializableTypesCallBaseClassMethodsOnISerializableTypes
CheckIdCheckId CA2236CA2236
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Un type dérive d’un type qui implémente le System.Runtime.Serialization.ISerializable interface et une des conditions suivantes est vraie :A type derives from a type that implements the System.Runtime.Serialization.ISerializable interface, and one of the following conditions is true:

Description de la règleRule description

Dans un processus de sérialisation personnalisé, un type implémente le GetObjectData méthode pour sérialiser ses champs et le constructeur de sérialisation pour désérialiser les champs.In a custom serialization process, a type implements the GetObjectData method to serialize its fields and the serialization constructor to de-serialize the fields. Si le type dérive d’un type qui implémente le ISerializable interface, le type de base GetObjectData constructeur de sérialisation et de la méthode doit être appelé pour sérialiser/désérialiser les champs du type de base.If the type derives from a type that implements the ISerializable interface, the base type GetObjectData method and serialization constructor should be called to serialize/de-serialize the fields of the base type. Sinon, le type ne sera pas sérialisé et désérialisé correctement.Otherwise, the type will not be serialized and de-serialized correctly. Notez que si le type dérivé n’ajoute pas tous les nouveaux champs, le type n’a pas besoin d’implémenter le GetObjectData méthode, ni le constructeur de sérialisation ou d’appeler les équivalents de type de base.Note that if the derived type does not add any new fields, the type does not need to implement the GetObjectData method nor the serialization constructor or call the base type equivalents.

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, appelez le type de base GetObjectData constructeur de sérialisation ou de la méthode à partir de le correspondantes dérivée de méthode de type ou le constructeur.To fix a violation of this rule, call the base type GetObjectData method or serialization constructor from the corresponding derived type method or constructor.

Quand supprimer les avertissementsWhen to suppress warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule.

ExempleExample

L’exemple suivant montre un type dérivé qui satisfait la règle en appelant le constructeur de sérialisation et GetObjectData méthode de la classe de base.The following example shows a derived type that satisfies the rule by calling the serialization constructor and GetObjectData method of the base class.

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 : Implémentez ISerializable correctementCA2240: Implement ISerializable correctly

CA2229 : Implémentez des constructeurs de sérialisationCA2229: Implement serialization constructors

CA2238 : Implémentez les méthodes de sérialisation correctementCA2238: Implement serialization methods correctly

CA2235 : Marquez tous les champs non sérialisablesCA2235: Mark all non-serializable fields

CA2237 : Marquez les types ISerializable avec SerializableAttributeCA2237: Mark ISerializable types with SerializableAttribute

CA2239 : Spécifiez des méthodes de désérialisation pour les champs facultatifsCA2239: Provide deserialization methods for optional fields

CA2120 : Sécurisez les constructeurs de sérialisationCA2120: Secure serialization constructors