Condividi tramite


CA2236: Chiamare metodi della classe base su tipi ISerializable

Articolo Valore
ID regola CA2236
Category Microsoft.Usage
Modifica Nessuna interruzione

Causa

Un tipo deriva da un tipo che implementa l'interfaccia System.Runtime.Serialization.ISerializable e una delle condizioni seguenti è vera:

Descrizione regola

In un processo di serializzazione personalizzato, un tipo implementa il GetObjectData metodo per serializzare i relativi campi e il costruttore di serializzazione per de-serializzare i campi. Se il tipo deriva da un tipo che implementa l'interfaccia ISerializable , il metodo del tipo GetObjectData di base e il costruttore di serializzazione devono essere chiamati per serializzare/de-serializzare i campi del tipo di base. In caso contrario, il tipo non verrà serializzato e de serializzato correttamente. Si noti che se il tipo derivato non aggiunge nuovi campi, il tipo non deve implementare il GetObjectData metodo né il costruttore di serializzazione o chiamare gli equivalenti del tipo di base.

Come correggere le violazioni

Per correggere una violazione di questa regola, chiamare il metodo del tipo GetObjectData di base o il costruttore di serializzazione dal metodo o dal costruttore di tipo derivato corrispondente.

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio seguente viene illustrato un tipo derivato che soddisfa la regola chiamando il costruttore di serializzazione e GetObjectData il metodo della classe base.

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: Implementare ISerializable in modo corretto

CA2229: Implementare costruttori di serializzazione

CA2238: Implementare correttamente i metodi di serializzazione

CA2235: Contrassegnare tutti i campi non serializzabili

CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

CA2239: Specificare metodi di deserializzazione per i campi facoltativi

CA2120: Proteggere i costruttori di serializzazione