Freigeben über


CA2236: Basisklassenmethoden auf ISerializable-Typen aufrufen.

Element Wert
RuleId CA2236
Category 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, und 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. Beachten Sie, dass der Typ, wenn der abgeleitete Typ keine neuen Felder hinzufügt, weder die GetObjectData-Methode noch den Serialisierungskonstruktor implementieren oder die Basistypäquivalente aufrufen muss.

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 im 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 die Regel erfüllt, indem der Serialisierungskonstruktor und die GetObjectData-Methode der Basisklasse aufgerufen werden.

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

CA2240: ISerializable ordnungsgemäß implementieren.

CA2229: Serialisierungskonstruktoren implementieren.

CA2238: Serialisierungsmethoden korrekt implementieren.

CA2235: Alle nicht serialisierbaren Felder markieren.

CA2237: ISerializable-Typen mit SerializableAttribute markieren.

CA2239: Deserialisierungsmethoden für optionale Felder angeben.

CA2120: Sichere Serialisierungskonstruktoren.