CA2236 : Appelez les méthodes de la classe de base sur les types ISerializable
TypeName |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Un type dérive d'un type qui implémente l'interface System.Runtime.Serialization.ISerializable, et une des conditions suivantes est vraie :
Le type implémente le constructeur de sérialisation, c'est-à-dire un constructeur doté de la signature de paramètre System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext, mais n'appelle pas le constructeur de sérialisation du type de base.
Le type implémente la méthode ISerializable.GetObjectData mais n'appelle pas la méthode GetObjectData du type de base.
Description de la règle
Dans un processus de sérialisation personnalisé, un type implémente la méthode GetObjectData pour sérialiser ses champs, et implémente le constructeur de sérialisation pour les désérialiser. Si le type dérive d'un type qui implémente l'interface ISerializable, la méthode GetObjectData et le constructeur de sérialisation du type de base doivent être appelés pour sérialiser/désérialiser les champs du type de base. Sinon, le type ne sera pas correctement sérialisé et désérialisé. Remarquez que si le type dérivé n'ajoute aucun champ nouveau, le type n'a besoin d'implémenter ni la méthode GetObjectData ni le constructeur de sérialisation, ni encore d'appeler les équivalents du type de base.
Comment corriger les violations
Pour corriger une violation de cette règle, appelez la méthode GetObjectData ou le constructeur de sérialisation du type de base issus du constructeur ou de la méthode du type dérivé correspondant.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant présente un type dérivé qui satisfait la règle en appelant le constructeur de sérialisation et la méthode GetObjectData de la classe de base.
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
<SerializableAttribute> _
Public Class DerivedType: Inherits BaseType
Dim derivedValue As Integer
Sub New()
derivedValue = 4
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
MyBase.New(info, context)
derivedValue = info.GetInt32("derivedValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overrides Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext)
info.AddValue("derivedValue", derivedValue)
MyBase.GetObjectData(info, context)
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);
}
}
[SerializableAttribute]
public class DerivedType : BaseType
{
int derivedValue;
public DerivedType()
{
derivedValue = 4;
}
protected DerivedType(
SerializationInfo info, StreamingContext context) :
base(info, context)
{
derivedValue = info.GetInt32("derivedValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public override void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("derivedValue", derivedValue);
base.GetObjectData(info, context);
}
}
}
Règles connexes
CA2240 : Implémentez ISerializable comme il se doit
CA2229 : Implémentez des constructeurs de sérialisation
CA2238 : Implémentez les méthodes de sérialisation comme il se doit
CA2235 : Marquez tous les champs non sérialisés
CA2237 : Marquer les types ISerializable avec SerializableAttribute
CA2239 : Spécifiez des méthodes de désérialisation pour les champs facultatifs