Partager via


CA2237 : Marquer les types ISerializable avec SerializableAttribute

TypeName

MarkISerializableTypesWithSerializable

CheckId

CA2237

Catégorie

Microsoft.Usage

Modification avec rupture

Modification sans rupture

Cause

Un type visible extérieurement implémente l'interface ISerializable et n'est pas marqué avec l'attribut SerializableAttribute.La règle ignore des types dérivés dont le type de base n'est pas sérialisable.

Description de la règle

Pour être reconnus par le Common Language Runtime comme sérialisables, les types doivent être marqués de l'attribut SerializableAttribute même s'ils utilisent une routine de sérialisation personnalisée par le biais de l'implémentation de l'interface ISerializable.

Comment corriger les violations

Pour corriger une violation de cette règle, appliquez l'attribut SerializableAttribute au type.

Quand supprimer les avertissements

Ne supprimez pas d'avertissement de cette règle pour les classes d'exception car celles-ci doivent être sérialisables pour fonctionner correctement à l'échelle des différents domaines d'application.

Exemple

L'exemple suivant présente un type qui enfreint la règle.Supprimez les marques de commentaire de la ligne de l'attribut SerializableAttribute pour satisfaire la règle.

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 

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);
      }
   }
}

Règles connexes

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

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

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

CA2120 : Sécurisez les constructeurs de sérialisation