CA2235: Marcar todos los campos no serializables
Propiedad | Value |
---|---|
Identificador de la regla | CA2235 |
Título | Marcar todos los campos no serializables |
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 campo de instancia de un tipo que no es serializable se declara en un tipo que es serializable.
Descripción de la regla
Un tipo serializable es el que está marcado con el atributo System.SerializableAttribute. Cuando se serializa el tipo, se inicia una excepción System.Runtime.Serialization.SerializationException si el tipo contiene un campo de instancia de un tipo que no es serializable y no implementa la interfaz System.Runtime.Serialization.ISerializable.
Sugerencia
CA2235 no se activa para los campos de instancia de tipos que implementan ISerializable porque proporcionan su propia lógica de serialización.
Cómo corregir infracciones
Para corregir una infracción de esta regla, aplique el atributo System.NonSerializedAttribute al campo que no es serializable.
Cuándo suprimir las advertencias
Solo debe suprimir una advertencia de esta regla si se declara un tipo System.Runtime.Serialization.ISerializationSurrogate que permita la serialización y deserialización de las instancias del campo.
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 CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
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.CA2235.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 muestran dos tipos: uno que infringe la regla y otro que cumple la regla.
public class Mouse
{
int buttons;
string scanTypeValue;
public int NumberOfButtons
{
get { return buttons; }
}
public string ScanType
{
get { return scanTypeValue; }
}
public Mouse(int numberOfButtons, string scanType)
{
buttons = numberOfButtons;
scanTypeValue = scanType;
}
}
[Serializable]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
Mouse opticalMouse;
public InputDevices1()
{
opticalMouse = new Mouse(5, "optical");
}
}
[Serializable]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerialized]
Mouse opticalMouse;
public InputDevices2()
{
opticalMouse = new Mouse(5, "optical");
}
}
Imports System
Imports System.Runtime.Serialization
Namespace ca2235
Public Class Mouse
ReadOnly Property NumberOfButtons As Integer
ReadOnly Property ScanType As String
Sub New(numberOfButtons As Integer, scanType As String)
Me.NumberOfButtons = numberOfButtons
Me.ScanType = scanType
End Sub
End Class
<SerializableAttribute>
Public Class InputDevices1
' Violates MarkAllNonSerializableFields.
Dim opticalMouse As Mouse
Sub New()
opticalMouse = New Mouse(5, "optical")
End Sub
End Class
<SerializableAttribute>
Public Class InputDevices2
' Satisfies MarkAllNonSerializableFields.
<NonSerializedAttribute>
Dim opticalMouse As Mouse
Sub New()
opticalMouse = New Mouse(5, "optical")
End Sub
End Class
End Namespace
Observaciones
La regla CA2235 no analiza los tipos que implementan la interfaz ISerializable (a menos que también estén marcados con el atributo SerializableAttribute). Esto se debe a que la regla CA2237 ya recomienda tipos de marcado que implementan la interfaz ISerializable con el atributo SerializableAttribute.