CA2237: Markieren von ISerializable-Typen mit SerializableAttribute

TypeName

MarkISerializableTypesWithSerializable

CheckId

CA2237

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein extern sichtbarer Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, der Typ ist jedoch nicht mit dem System.SerializableAttribute-Attribut markiert.Abgeleitete Typen, deren Basistyp nicht serialisierbar ist, werden von der Regel ignoriert.

Regelbeschreibung

Damit Typen von der Common Language Runtime als serialisierbar erkannt werden, müssen sie mit dem SerializableAttribute-Attribut markiert werden, auch wenn der Typ durch die Implementierung der ISerializable-Schnittstelle eine benutzerdefinierte Serialisierungsroutine verwendet.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, wenden Sie das SerializableAttribute-Attribut auf den Typ an.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie bei Ausnahmeklassen keine Warnung dieser Regel, da diese Klassen serialisierbar sein müssen, wenn sie in verschiedenen Anwendungsdomänen einwandfrei funktionieren sollen.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen die Regel verstößt.Heben Sie die Auskommentierung der SerializableAttribute-Attributzeile auf, damit die Regel erfüllt wird.

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

Verwandte Regeln

CA2236: Basisklassenmethoden auf ISerializable-Typen aufrufen

CA2240: ISerializable ordnungsgemäß implementieren

CA2229: Serialisierungskonstruktoren implementieren

CA2238: Serialisierungsmethoden korrekt implementieren

CA2235: Alle nicht serialisierbaren Felder markieren

CA2239: Deserialisierungsmethoden für optionale Felder angeben

CA2120: Sichere Serialisierungskonstruktoren