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é par défaut dans .NET 8 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);
    }
}

CA2237 : Marquer les types ISerializable avec SerializableAttribute

Voir aussi