Compartir a través de


Marcar los tipos ISerializable con SerializableAttribute

Actualización: noviembre 2007

Nombre de tipo

MarkISerializableTypesWithSerializable

Identificador de comprobación

CA2237

Categoría

Microsoft.Usage

Cambio problemático

No problemático

Motivo

Un tipo visible externamente implementa la interfaz System.Runtime.Serialization.ISerializable y el tipo no se marca con el atributo System.SerializableAttribute. La regla omite los tipos derivados cuyo tipo base no es serializable.

Descripción de la regla

Para que los tipos sean reconocidos como serializables por el Common Language Runtime deben estar marcados con el atributo SerializableAttribute incluso si el tipo utiliza una rutina de serialización personalizada a través de la implementación de la interfaz ISerializable.

Cómo corregir infracciones

Para corregir una infracción de esta regla, aplique el atributo SerializableAttribute al tipo.

Cuándo suprimir advertencias

No suprima ninguna advertencia de esta regla para las clases de excepción porque deben ser serializables para que funcionen correctamente en los dominios de aplicación.

Ejemplo

El siguiente ejemplo muestra un tipo que infringe la regla. Quite los comentarios de línea del atributo SerializableAttribute para cumplir la regla.

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

Reglas relacionadas

Llamar a métodos de clase base en tipos ISerializable

Implementar ISerializable correctamente

Implementar constructores de serialización

Implementar los métodos de serialización de forma correcta

Marcar todos los campos no serializables

Proporcionar métodos de deserialización para campos opcionales

Proteger los constructores de serialización