CA2235: Marcar todos los campos no serializables
Nombre de tipo |
MarkAllNonSerializableFields |
Identificador de comprobación |
CA2235 |
Categoría |
Microsoft.Usage |
Cambio problemático |
No |
Motivo
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 aquel marcado con el atributo System.SerializableAttribute.Cuando se serializa el tipo, se produce una excepción System.Runtime.Serialization.SerializationException si un tipo contiene un campo de instancia de un tipo que no es serializable.
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 advertencias
Sólo suprima ninguna advertencia de esta regla si se declara un tipo System.Runtime.Serialization.ISerializationSurrogate que permite deserializar instancias del campo.
Ejemplo
El ejemplo siguiente muestra un tipo que infringe la regla y otro que la cumple.
Imports System
Imports System.Runtime.Serialization
Namespace UsageLibrary
Public Class Mouse
Dim buttons As Integer
Dim scanTypeValue As String
ReadOnly Property NumberOfButtons As Integer
Get
Return buttons
End Get
End Property
ReadOnly Property ScanType As String
Get
Return scanTypeValue
End Get
End Property
Sub New(numberOfButtons As Integer, scanType As String)
buttons = numberOfButtons
scanTypeValue = 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
using System;
using System.Runtime.Serialization;
namespace UsageLibrary
{
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;
}
}
[SerializableAttribute]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
Mouse opticalMouse;
public InputDevices1()
{
opticalMouse = new Mouse(5, "optical");
}
}
[SerializableAttribute]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerializedAttribute]
Mouse opticalMouse;
public InputDevices2()
{
opticalMouse = new Mouse(5, "optical");
}
}
}
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
CA2237: Marcar los tipos ISerializable con SerializableAttribute
CA2239: Proporcionar métodos de deserialización para campos opcionales