CA2229 : Implémentez des constructeurs de sérialisation
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Le type implémente l'interface System.Runtime.Serialization.ISerializable, n'est ni un délégué ni une interface, et l'une des conditions suivantes est vraie :
Le type ne dispose d'aucun constructeur qui accepte un objet System.Runtime.Serialization.SerializationInfo et un objet System.Runtime.Serialization.StreamingContext (la signature du constructeur de sérialisation).
Le type est non-sealed (non scellé) et le modificateur d'accès pour son constructeur de sérialisation n'est pas protégé (famille).
Le type est sealed (scellé) et le modificateur d'accès pour son constructeur de sérialisation n'est pas privé.
Description de la règle
Cette règle est pertinente pour les types qui prennent en charge la sérialisation personnalisée. Un type prend en charge la sérialisation personnalisée s'il implémente l'interface ISerializable. Le constructeur de sérialisation est tenu de désérialiser ou de recréer des objets qui ont été sérialisés à l'aide de la méthode ISerializable.GetObjectData.
Comment corriger les violations
Pour corriger une violation de cette règle, implémentez le constructeur de sérialisation. Dans le cas d'une classe sealed, rendez le constructeur privé ; sinon, attribuez-lui l'état protégé.
Quand supprimer les avertissements
Ne supprimez aucune violation de la règle. Le type ne sera pas désérialisable et ne fonctionnera pas dans de nombreux scénarios.
Exemple
L'exemple suivant présente un type qui satisfait la règle.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace UsageLibrary
{
[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
private int n1;
// This is a regular constructor.
public SerializationConstructorsRequired ()
{
n1 = -1;
}
// This is the serialization constructor.
// Satisfies rule: ImplementSerializationConstructors.
protected SerializationConstructorsRequired(
SerializationInfo info,
StreamingContext context)
{
n1 = (int) info.GetValue("n1", typeof(int));
}
// The following method serializes the instance.
[SecurityPermission(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Règles connexes
CA2237 : Marquer les types ISerializable avec SerializableAttribute
Voir aussi
Référence
System.Runtime.Serialization.ISerializable