Udostępnij przez


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 10 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ż