CA2236: Basisklassenmethoden auf ISerializable-Typen aufrufen

TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

Kategorie (Category)

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Typ wird von einem Typ abgeleitet, der die 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.

Behandeln 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

CA2240: ISerializable ordnungsgemäß implementieren

CA2229: Serialisierungskonstruktoren implementieren

CA2238: Serialisierungsmethoden korrekt implementieren

CA2235: Alle nicht serialisierbaren Felder markieren

CA2237: Markieren von ISerializable-Typen mit SerializableAttribute

CA2239: Deserialisierungsmethoden für optionale Felder angeben

CA2120: Sichere Serialisierungskonstruktoren