CA2229: Implementare costruttori di serializzazione
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Il tipo implementa l'interfaccia System.Runtime.Serialization.ISerializable, non è un delegato o un'interfaccia e una delle seguenti condizioni è vera:
Il tipo non dispone di un costruttore che accetta un oggetto System.Runtime.Serialization.SerializationInfo e un oggetto System.Runtime.Serialization.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
Vedere anche
Riferimenti
System.Runtime.Serialization.ISerializable