CA2237: Marcar los tipos ISerializable con SerializableAttribute

Propiedad Value
Identificador de la regla CA2237
Título Marcar los tipos ISerializable con SerializableAttribute
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Un tipo visible externamente implementa la interfaz System.Runtime.Serialization.ISerializable y el tipo no está marcado 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 Common Language Runtime, deben estar marcados con el atributo SerializableAttribute incluso si el tipo usa una rutina de serialización personalizada mediante 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 las advertencias

No suprima una advertencia de esta regla en las clases de excepción, ya que deben ser serializables para que funcionen correctamente en todos los dominios de aplicación.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo

En el ejemplo siguiente se muestra un tipo que infringe la regla. Quite la marca de comentario de la línea de atributo SerializableAttribute para satisfacer la regla.

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

Namespace ca2237

    ' <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

        Overridable Sub GetObjectData(
         info As SerializationInfo, context As StreamingContext) _
         Implements ISerializable.GetObjectData

            info.AddValue("baseValue", baseValue)

        End Sub

    End Class

End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
    int baseValue;

    public BaseType()
    {
        baseValue = 3;
    }

    protected BaseType(
       SerializationInfo info, StreamingContext context)
    {
        baseValue = info.GetInt32("baseValue");
    }

    public virtual void GetObjectData(
       SerializationInfo info, StreamingContext context)
    {
        info.AddValue("baseValue", baseValue);
    }
}