CA2236: Volejte metody třídy Base na typech ISerializable

Zboží Hodnota
RuleId CA2236
Kategorie Microsoft.Usage
Změna způsobující chybu Nenarušující

Příčina

Typ je odvozen od typu, který implementuje System.Runtime.Serialization.ISerializable rozhraní, a jedna z následujících podmínek je pravdivá:

Popis pravidla

V procesu vlastní serializace typ implementuje metodu GetObjectData serializace svých polí a konstruktor serializace de-serializace pole. Pokud typ je odvozen od typu, který implementuje ISerializable rozhraní, základní typ GetObjectData metoda a serializace konstruktor by měly být volány serializace/de-serializace pole základního typu. V opačném případě nebude typ serializován a de-serializován správně. Všimněte si, že pokud odvozený typ nepřidá žádná nová pole, typ nemusí implementovat metodu GetObjectData ani konstruktor serializace nebo volat ekvivalenty základního typu.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, volejte metodu základního typu GetObjectData nebo konstruktor serializace z odpovídající odvozené metody nebo konstruktoru odvozeného typu.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje odvozený typ, který splňuje pravidlo voláním serializace konstruktoru a GetObjectData metody základní třídy.

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: Implementujte správně ISerializable

CA2229: Implementovat serializační konstruktory

CA2238: Implementujte správně metody serializace

CA2235: Označte všechna neserializovatelná pole

CA2237: Označte typy ISerializable pomocí SerializableAttribute

CA2239: Poskytujte metody deserializace pro nepovinné pole

CA2120: Zabezpečte serializační konstruktory