CA2229: Implementar constructores de serialización

Propiedad Value
Identificador de la regla CA2229
Título Implementar constructores de serialización
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Nota:

Esta regla se quitó en .NET 8 porque entra en conflicto con SYSLIB0051: las API de compatibilidad con la serialización heredada están obsoletas.

Causa

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

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

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

  • El tipo está sellado y el modificador de acceso de 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 admite la serialización personalizada si implementa la interfaz ISerializable. El constructor de serialización es necesario para deserializar (volver a crear) objetos que se han serializado mediante 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 las advertencias

No suprima una infracción de la regla. El tipo no se podrá deserializar y no funcionará en muchos escenarios.

Ejemplo

En el ejemplo siguiente se muestra un tipo que cumple la regla.

[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 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
            (int)info.GetValue(nameof(n1), typeof(int))! :
            -1;
    }

    // The following method serializes the instance.
    void ISerializable.GetObjectData(SerializationInfo info,
       StreamingContext context)
    {
        info.AddValue(nameof(n1), n1);
    }
}

CA2237: Marcar los tipos ISerializable con SerializableAttribute

Consulte también