Marquer les types ISerializable avec SerializableAttribute
Mise à jour : novembre 2007
TypeName |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Un type visible extérieurement implémente l'interface System.Runtime.Serialization.ISerializable et n'est pas marqué avec l'attribut System.SerializableAttribute. La règle ignore des types dérivés dont le type de base n'est pas sérialisable.
Description de la règle
Pour être reconnus par le Common Language Runtime comme sérialisables, les types doivent être marqués de l'attribut SerializableAttribute même s'ils utilisent une routine de sérialisation personnalisée par le biais 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 pour les classes d'exception car celles-ci doivent être sérialisables pour fonctionner correctement à l'échelle des différents domaines d'application.
Exemple
L'exemple suivant présente un type qui enfreint la règle. Supprimez les marques de commentaire de la ligne de l'attribut SerializableAttribute pour satisfaire la règle.
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
' <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
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
}
Règles connexes
Appelez les méthodes de la classe de base sur des types ISerializable
Implémentez ISerializable comme il se doit
Implémentez des constructeurs de sérialisation
Implémentez les méthodes de sérialisation comme il se doit
Marquez tous les champs non sérialisables
Spécifiez des méthodes de désérialisation pour les champs facultatifs