CA2235 : Marquez tous les champs non sérialisés
TypeName |
MarkAllNonSerializableFields |
CheckId |
CA2235 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Un champ d'instance d'un type non sérialisable est déclaré dans un type sérialisable.
Description de la règle
Un type sérialisable est marqué avec l'attribut SerializableAttribute.Lorsque le type est sérialisé, une exception SerializationException est levée si un type contient un champ d'instance d'un type qui n'est pas sérialisable.
Comment corriger les violations
Pour corriger une violation de cette règle, appliquez l'attribut NonSerializedAttribute au champ qui n'est pas sérialisable.
Quand supprimer les avertissements
Supprimez uniquement un avertissement de cette règle en cas de déclaration d'un type ISerializationSurrogate qui autorise des instances du champ à être sérialisées et désérialisées.
Exemple
L'exemple suivant présente un type qui viole la règle et un autre qui satisfait la règle.
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");
}
}
}
Règles connexes
CA2236 : Appelez les méthodes de la classe de base sur les types ISerializable
CA2240 : Implémentez ISerializable comme il se doit
CA2229 : Implémentez des constructeurs de sérialisation
CA2238 : Implémentez les méthodes de sérialisation comme il se doit
CA2237 : Marquer les types ISerializable avec SerializableAttribute
CA2239 : Spécifiez des méthodes de désérialisation pour les champs facultatifs