Compartir a través de


CA2229: Implementar constructores de serialización

TypeName

ImplementSerializationConstructors

Identificador de comprobación

CA2229

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

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

  • El tipo no tiene un constructor que toma un objeto SerializationInfo y un objeto StreamingContext (la firma del constructor de serialización).

  • El tipo no está sellado y el modificador de acceso para su constructor de serialización no está protegido (familia).

  • El tipo está sellado y el modificador de acceso para su constructor de serialización no es privado.

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

CA2237: Marcar los tipos ISerializable con SerializableAttribute

Vea también

Referencia

ISerializable

SerializationInfo

StreamingContext