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.Runtime.Serialization
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);
}
}