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 9 | 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.Runtime.Serialization
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);
}
}