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 łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

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 obiekty SerializationInfo i StreamingContext (sygnatura 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ą, jeśli implementuje interfejs ISerializable. 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 konstruktor powinien być prywatny; w przeciwnym razie należy go chronić.

Kiedy pomijać ostrzeżenia

Nie tuszuj 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 atrybutem SerializableAttribute

Zobacz też