Condividi tramite


CA2236: Chiamare metodi della classe base su tipi ISerializable

TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un tipo deriva da un tipo che implementa l'interfaccia System.Runtime.Serialization.ISerializable e si verifica una delle condizioni riportate di seguito:

Descrizione della regola

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

Come correggere le violazioni

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

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

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

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

Regole correlate

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: Fornire metodi di deserializzazione per i campi facoltativi

CA2120: Proteggere i costruttori di serializzazione