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