CA2235 : Marquez tous les champs non sérialisés
Propriété | Value |
---|---|
Identificateur de la règle | CA2235 |
Titre | Marquez tous les champs non sérialisés |
Catégorie | Utilisation |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
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 un type marqué avec l’attribut System.SerializableAttribute. Lorsque le type est sérialisé, une exception System.Runtime.Serialization.SerializationException est levée si le type contient un champ d’instance d’un type qui n’est pas sérialisable et n’implémente pas l’interface System.Runtime.Serialization.ISerializable.
Conseil
CA2235 ne se déclenche pas pour les champs d’instance de types qui implémentent ISerializable, car ils fournissent leur propre logique de sérialisation.
Comment corriger les violations
Pour corriger une violation de cette règle, appliquez l’attribut System.NonSerializedAttribute au champ qui n’est pas sérialisable.
Quand supprimer les avertissements
Supprimez uniquement un avertissement de cette règle si un type System.Runtime.Serialization.ISerializationSurrogate est déclaré, permettant aux instances du champ d’être sérialisées et désérialisées.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemple
L’exemple suivant montre deux types, une qui enfreint la règle et l’autre qui est conforme à la règle.
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
Notes
La règle CA2235 n’analyse pas les types qui implémentent l’interface ISerializable (sauf s’ils sont également marqués avec l’attribut SerializableAttribute). En effet, la règle CA2237 recommande déjà de marquer les types qui implémentent l’interface ISerializable avec l’attribut SerializableAttribute.