Condividi tramite


CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

TypeName

MarkISerializableTypesWithSerializable

CheckId

CA2237

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un tipo visibile esternamente implementa l'interfaccia System.Runtime.Serialization.ISerializable e non è contrassegnato con l'attributo System.SerializableAttribute. La regola ignora i tipi derivati il cui tipo di base non è serializzabile.

Descrizione della regola

Affinché i tipi vengano riconosciuti come serializzabili in Common Language Runtime, è necessario che siano contrassegnati con l'attributo SerializableAttribute anche se il tipo utilizza una routine di serializzazione personalizzata tramite l'implementazione dell'interfaccia ISerializable.

Come correggere le violazioni

Per correggere una violazione di questa regola, applicare l'attributo SerializableAttribute al tipo.

Esclusione di avvisi

Non escludere un avviso da questa regola per le classi di eccezioni perché per funzionare correttamente in diversi domini applicazione è necessario che siano serializzabili.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che viola la regola. Rimuovere il commento dalla riga dell'attributo SerializableAttribute per soddisfare la regola.

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

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

Regole correlate

CA2236: Chiamare metodi della classe base su tipi ISerializable

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

CA2239: Fornire metodi di deserializzazione per i campi facoltativi

CA2120: Proteggere i costruttori di serializzazione