Partager via


CA2236 : Appelez les méthodes de la classe de base sur les types ISerializable

Élément Valeur
ID de la règle CA2236
Category Microsoft.Usage
Modification avec rupture Sans rupture

Cause

Un type dérive d’un type qui implémente l’interface System.Runtime.Serialization.ISerializable, et l’une des conditions suivantes est vraie :

Description de la règle

Dans un processus de sérialisation personnalisé, un type implémente la méthode GetObjectData pour sérialiser ses champs et le constructeur de sérialisation pour désérialiser les champs. Si le type dérive d’un type qui implémente l’interface ISerializable, la méthode GetObjectData de type de base et le constructeur de sérialisation doivent être appelés pour sérialiser/désérialiser les champs du type de base. Si ce n’est pas le cas, le type n’est pas sérialisé ni désérialisé correctement. Notez que si le type dérivé n’ajoute aucun nouveau champ, le type n’a pas besoin d’implémenter la méthode GetObjectData ni le constructeur de sérialisation ni d’appeler les équivalents de type de base.

Comment corriger les violations

Pour corriger une violation de cette règle, appelez la méthode GetObjectData ou le constructeur de sérialisation du type de base issu du constructeur ou de la méthode du type dérivé correspondant.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L’exemple suivant montre un type dérivé qui satisfait à la règle en appelant le constructeur de sérialisation et la méthode GetObjectData de la classe de 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 : Implémentez ISerializable comme il se doit

CA2229 : Implémentez des constructeurs de sérialisation

CA2238 : Implémentez les méthodes de sérialisation comme il se doit

CA2235 : Marquez tous les champs non sérialisés

CA2237 : Marquer les types ISerializable avec SerializableAttribute

CA2239 : Spécifiez des méthodes de désérialisation pour les champs facultatifs

CA2120 : Sécurisez les constructeurs de sérialisation