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