CA2229: Implementare costruttori di serializzazione
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Il tipo implementa l'interfaccia ISerializable, non è un delegato o un'interfaccia e una delle seguenti condizioni è vera:
Il tipo non dispone di un costruttore che accetta un oggetto SerializationInfo e un oggetto StreamingContext (la firma del costruttore di serializzazione).
Il tipo è non sealed e il modificatore di accesso per il costruttore di serializzazione non è protetto (a livello di famiglia).
Il tipo è sealed e il modificatore di accesso per il costruttore di serializzazione non è privato.
Descrizione della regola
Questa regola si applica ai tipi che supportano la serializzazione personalizzata.Un tipo supporta la serializzazione personalizzata se implementa l'interfaccia ISerializable.Il costruttore di serializzazione è necessario per deserializzare o ricreare oggetti serializzati con il metodo ISerializable.GetObjectData.
Come correggere le violazioni
Per correggere una violazione di questa regola, implementare il costruttore di serializzazione.Per una classe sealed, rendere il costruttore privato; in caso contrario renderlo protetto.
Esclusione di avvisi
Non escludere una violazione da questa regola.Il tipo non risulterà deserializzabile e in molti scenari non funzionerà.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo che soddisfa la regola.
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);
}
}
}
Regole correlate
CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute