Sdílet prostřednictvím


Basisklassenmethoden in ISerializable-Typen aufrufen

Aktualisiert: November 2007

     TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Typ wird von einem Typ abgeleitet, der die System.Runtime.Serialization.ISerializable-Schnittstelle implementiert, und eine der folgenden Bedingungen ist erfüllt:

Regelbeschreibung

In einem benutzerdefinierten Serialisierungsprozess implementiert ein Typ die GetObjectData-Methode, um seine Felder zu serialisieren, sowie den Serialisierungskonstruktor, um die Felder zu deserialisieren. Wenn der Typ von einem Typ abgeleitet wird, der die ISerializable-Schnittstelle implementiert, sollten die GetObjectData-Methode und der Serialisierungskonstruktor des Basistyps aufgerufen werden, um die Felder des Basistyps zu serialisieren/deserialisieren. Andernfalls wird der Typ nicht ordnungsgemäß serialisiert und deserialisiert. Wenn der abgeleitete Typ keine neuen Felder hinzufügt, muss der Typ weder die GetObjectData-Methode noch den Serialisierungskonstruktor implementieren und auch keine Entsprechungen des Basistyps aufrufen.

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, rufen Sie die GetObjectData-Methode oder den Serialisierungskonstruktor des Basistyps in der Methode oder dem Konstruktor des entsprechenden abgeleiteten Typs auf.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Das folgende Beispiel zeigt einen abgeleiteten Typ, der der Regel entspricht, da der Serialisierungskonstruktor und die GetObjectData-Methode der Basisklasse aufgerufen werden.

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

   <SerializableAttribute> _ 
   Public Class DerivedType: Inherits BaseType

      Dim derivedValue As Integer

      Sub New()
         derivedValue = 4
      End Sub

      Protected Sub New( _ 
         info As SerializationInfo, context As StreamingContext)

         MyBase.New(info, context)      
         derivedValue = info.GetInt32("derivedValue")

      End Sub

      <SecurityPermissionAttribute(SecurityAction.Demand, _ 
          SerializationFormatter := True)> _ 
      Overrides Sub GetObjectData( _ 
         info As SerializationInfo, context As StreamingContext)

         info.AddValue("derivedValue", derivedValue)
         MyBase.GetObjectData(info, context)

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

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

Verwandte Regeln

ISerializable ordnungsgemäß implementieren

Serialisierungskonstruktoren implementieren

Serialisierungsmethoden korrekt implementieren?

Alle nicht serialisierbaren Felder markieren

Markieren von ISerializable-Typen mit SerializableAttribute

Deserialisierungsmethoden für optionale Felder angeben

Sichere Serialisierungskonstruktoren