Udostępnij za pośrednictwem


CA2229: Należy zaimplementować konstruktory serializacji

Właściwości Wartość
Identyfikator reguły CA2229
Tytuł Zaimplementuj konstruktory serializacji
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Uwaga

Ta reguła została usunięta na platformie .NET 8, ponieważ powoduje konflikt z SYSLIB0051: starsze interfejsy API obsługi serializacji są przestarzałe.

Przyczyna

Typ implementuje System.Runtime.Serialization.ISerializable interfejs, nie jest delegatem ani interfejsem, a jeden z następujących warunków jest spełniony:

  • Typ nie ma konstruktora, który przyjmuje SerializationInfo obiekt i StreamingContext obiekt (podpis konstruktora serializacji).

  • Typ jest niezauczętowany, a modyfikator dostępu dla jego konstruktora serializacji nie jest chroniony (rodzina).

  • Typ jest zapieczętowany, a modyfikator dostępu dla jego konstruktora serializacji nie jest prywatny.

Opis reguły

Ta reguła jest odpowiednia dla typów, które obsługują serializację niestandardową. Typ obsługuje serializację niestandardową ISerializable , jeśli implementuje interfejs. Konstruktor serializacji jest wymagany do deserializacji lub ponownego utworzenia obiektów, które zostały serializowane przy użyciu ISerializable.GetObjectData metody .

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zaimplementować konstruktora serializacji. Dla zamkniętej klasy należy ustawić konstruktor prywatny; w przeciwnym razie powinien być chroniony.

Kiedy pomijać ostrzeżenia

Nie pomijaj naruszenia reguły. Typ nie będzie deserializowalny i nie będzie działać w wielu scenariuszach.

Przykład

W poniższym przykładzie pokazano typ, który spełnia regułę.

[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: Oznacz typy ISerializable za pomocą atrybutu SerializableAttribute

Zobacz też