Condividi tramite


CA2229: Implementare costruttori di serializzazione

TypeName

ImplementSerializationConstructors

CheckId

CA2229

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Il tipo implementa l'interfaccia ISerializable, non è un delegato o un'interfaccia e una delle seguenti condizioni è vera:

  • Il tipo non dispone di un costruttore che accetta un oggetto SerializationInfo e un oggetto StreamingContext (la firma del costruttore di serializzazione).

  • Il tipo è non sealed e il modificatore di accesso per il costruttore di serializzazione non è protetto (a livello di famiglia).

  • Il tipo è sealed e il modificatore di accesso per il costruttore di serializzazione non è privato.

Descrizione della regola

Questa regola si applica ai tipi che supportano la serializzazione personalizzata.Un tipo supporta la serializzazione personalizzata se implementa l'interfaccia ISerializable.Il costruttore di serializzazione è necessario per deserializzare o ricreare oggetti serializzati con il metodo ISerializable.GetObjectData.

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare il costruttore di serializzazione.Per una classe sealed, rendere il costruttore privato; in caso contrario renderlo protetto.

Esclusione di avvisi

Non escludere una violazione da questa regola.Il tipo non risulterà deserializzabile e in molti scenari non funzionerà.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che soddisfa la regola.

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);
        }
    }
}

Regole correlate

CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

Vedere anche

Riferimenti

ISerializable

SerializationInfo

StreamingContext