Compartir a través de


CA2237: Marcar los tipos ISerializable con SerializableAttribute

Nombre de tipo

MarkISerializableTypesWithSerializable

Identificador de comprobación

CA2237

Categoría

Microsoft.Usage

Cambio problemático

No

Causa

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

LCA2236: Llamar a métodos de clase base en tipos ISerializable

CA2240: Implementar ISerializable correctamente

CA2229: Implementar constructores de serialización

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

CA2235: Marcar todos los campos no serializables

CA2239: Proporcionar métodos de deserialización para campos opcionales

CA2120: Proteger los constructores de serializaciones