CA2229: Implementare costruttori di serializzazione

Proprietà valore
ID regola CA2229
Titolo Implementare costruttori di serializzazione
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 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);
    }
}

CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

Vedi anche