Partage via


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.