Sdílet prostřednictvím


Markieren von ISerializable-Typen mit SerializableAttribute

Aktualisiert: November 2007

     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.

Behandlung 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

Basisklassenmethoden in ISerializable-Typen aufrufen

ISerializable ordnungsgemäß implementieren

Serialisierungskonstruktoren implementieren

Serialisierungsmethoden korrekt implementieren?

Alle nicht serialisierbaren Felder markieren

Deserialisierungsmethoden für optionale Felder angeben

Sichere Serialisierungskonstruktoren