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

TypeNameTypeName MarkISerializableTypesWithSerializableMarkISerializableTypesWithSerializable
CheckIdCheckId CA2237CA2237
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Un type visible de l’extérieur implémente la System.Runtime.Serialization.ISerializable interface et le type n’est pas marqué avec le System.SerializableAttribute attribut.An externally visible type implements the System.Runtime.Serialization.ISerializable interface and the type is not marked with the System.SerializableAttribute attribute. La règle ignore les types dérivés dont le type de base n’est pas sérialisable.The rule ignores derived types whose base type is not serializable.

Description de la règleRule Description

Pour être reconnus par le common language runtime comme sérialisables, les types doivent être marqués avec le SerializableAttribute attribut même si le type d’utilise une routine de sérialisation personnalisée via l’implémentation de la ISerializable interface.To be recognized by the common language runtime as serializable, types must be marked with the SerializableAttribute attribute even if the type uses a custom serialization routine through implementation of the ISerializable interface.

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, appliquez le SerializableAttribute pour le type d’attribut.To fix a violation of this rule, apply the SerializableAttribute attribute to the type.

Quand supprimer les avertissementsWhen to Suppress Warnings

Ne supprimez aucun avertissement de cette règle pour les classes d’exception, car ils doivent être sérialisables pour fonctionner correctement sur plusieurs domaines d’application.Do not suppress a warning from this rule for exception classes because they must be serializable to work correctly across application domains.

ExempleExample

L’exemple suivant montre un type qui enfreint la règle.The following example shows a type that violates the rule. Ne pas commenter le SerializableAttribute pour satisfaire la règle de ligne de l’attribut.Uncomment the SerializableAttribute attribute line to satisfy the rule.

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

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

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

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