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 9 | 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);
}
}
Reglas relacionadas
CA2237: Marcar los tipos ISerializable con SerializableAttribute