Compartir a través de


Implementar constructores de serialización

Actualización: noviembre 2007

Nombre de tipo

ImplementSerializationConstructors

Identificador de comprobación

CA2229

Categoría

Microsoft.Usage

Cambio problemático

No problemático

Motivo

El tipo implementa la interfaz System.Runtime.Serialization.ISerializable, no es un delegado ni una interfaz, y una de las condiciones siguientes es verdadera:

Descripción de la regla

Esta regla es relevante para los tipos que admiten la serialización personalizada. Un tipo es compatible con la serialización personalizada si implementa la interfaz ISerializable. Es necesario que el constructor de serialización deserialice o vuelva a crear objetos que se han serializado utilizando el método ISerializable.GetObjectData.

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente el constructor de serialización. Para una clase sellada, marque el constructor como privado; de lo contrario, márquelo como protegido.

Cuándo suprimir advertencias

No suprima ninguna infracción de la regla. El tipo no será deserializable y no funcionará en muchos escenarios.

Ejemplo

El siguiente ejemplo muestra un tipo que infringe la regla.

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

Reglas relacionadas

Marcar los tipos ISerializable con SerializableAttribute

Vea también

Referencia

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext