Partager via


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

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext