CA2229: Implementare costruttori di serializzazione
Proprietà | valore |
---|---|
ID regola | CA2229 |
Title | Implementare costruttori di serializzazione |
Categoria | Utilizzo |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Nota
Questa regola è stata rimossa in .NET 8 perché è in conflitto con SYSLIB0051: le API di supporto della serializzazione legacy sono obsolete.
Causa
Il tipo implementa l'interfaccia System.Runtime.Serialization.ISerializable , non è un delegato o un'interfaccia e una delle condizioni seguenti è vera:
Il tipo non dispone di un costruttore che accetta un SerializationInfo oggetto e un StreamingContext oggetto (la firma del costruttore di serializzazione).
Il tipo non è bloccato e il modificatore di accesso per il relativo costruttore di serializzazione non è protetto (famiglia).
Il tipo è sealed e il modificatore di accesso per il relativo costruttore di serializzazione non è privato.
Descrizione regola
Questa regola è rilevante per i 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 tramite il ISerializable.GetObjectData metodo .
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.
Quando eliminare gli avvisi
Non eliminare una violazione della regola. Il tipo non sarà deserializzabile e non funzionerà in molti scenari.
Esempio
Nell'esempio seguente viene illustrato un tipo che soddisfa la regola.
[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);
}
}
Regole correlate
CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute