Condividi tramite


CA2229: Implementare costruttori di serializzazione

TypeName

ImplementSerializationConstructors

CheckId

CA2229

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

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

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

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext