CA2229 : Implémentez des constructeurs de sérialisation
Propriété | Value |
---|---|
Identificateur de la règle | CA2229 |
Titre | Implémentez des constructeurs de sérialisation |
Catégorie | Utilisation |
Le correctif est cassant ou non cassant | Sans rupture |
Activée par défaut dans .NET 9 | Non |
Remarque
Cette règle a été supprimée dans .NET 8, car elle est en conflit avec SYSLIB0051 : les API de prise en charge de la sérialisation héritée sont obsolètes.
Cause
Le type implémente l’interface System.Runtime.Serialization.ISerializable, n’est pas un délégué ou une interface, et l’une des conditions suivantes est remplie :
Le type n’a pas de constructeur qui accepte un objet SerializationInfo et un objet StreamingContext (la signature du constructeur de sérialisation).
Le type est unsealed et le modificateur d’accès pour son constructeur de sérialisation n’est pas protégé (famille).
Le type est sealed et le modificateur d’accès pour son constructeur de sérialisation n’est pas privé.
Description de la règle
Cette règle s’applique aux 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 requis pour désérialiser, ou recréer, des objets 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 pas une 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 montre un type qui satisfait à la règle.
[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 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
(int)info.GetValue(nameof(n1), typeof(int))! :
-1;
}
// The following method serializes the instance.
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue(nameof(n1), n1);
}
}
Règles associées
CA2237 : Marquer les types ISerializable avec SerializableAttribute