CA2237 : Marquer les types ISerializable avec SerializableAttribute

Propriété Value
Identificateur de la règle CA2237
Titre Marquer les types ISerializable avec SerializableAttribute
Catégorie Utilisation
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Un type visible en externe implémente l’interface System.Runtime.Serialization.ISerializable. Il n’est pas marqué de l’attribut System.SerializableAttribute. La règle ignore les types dérivés dont le type de base n’est pas sérialisable.

Description de la règle

Pour être reconnus comme sérialisables par le Common Language Runtime, les types doivent être marqués de l’attribut SerializableAttribute même s’ils utilisent une routine de sérialisation personnalisée au moyen de l’implémentation de l’interface ISerializable.

Comment corriger les violations

Pour corriger une violation de cette règle, appliquez l’attribut SerializableAttribute au type.

Quand supprimer les avertissements

Ne supprimez pas d’avertissement de cette règle concernant les classes d’exception, car celles-ci doivent être sérialisables pour fonctionner correctement entre les domaines d’application.

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 CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

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.CA2237.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple

L’exemple suivant montre un type qui enfreint la règle. Supprimez les marques de commentaire de la ligne d’attribut SerializableAttribute pour satisfaire à la règle.

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

Namespace ca2237

    ' <SerializableAttribute> _ 
    Public Class BaseType
        Implements ISerializable

        Dim baseValue As Integer

        Sub New()
            baseValue = 3
        End Sub

        Protected Sub New(
         info As SerializationInfo, context As StreamingContext)

            baseValue = info.GetInt32("baseValue")

        End Sub

        Overridable Sub GetObjectData(
         info As SerializationInfo, context As StreamingContext) _
         Implements ISerializable.GetObjectData

            info.AddValue("baseValue", baseValue)

        End Sub

    End Class

End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
    int baseValue;

    public BaseType()
    {
        baseValue = 3;
    }

    protected BaseType(
       SerializationInfo info, StreamingContext context)
    {
        baseValue = info.GetInt32("baseValue");
    }

    public virtual void GetObjectData(
       SerializationInfo info, StreamingContext context)
    {
        info.AddValue("baseValue", baseValue);
    }
}