CA2229: Serialisierungskonstruktoren implementieren.

Eigenschaft Wert
Regel-ID CA2229
Titel Serialisierungskonstruktoren implementieren.
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 9 aktiviert Nein

Hinweis

Diese Regel wurde in .NET 8 entfernt, da sie im Konflikt mit SYSLIB0051: Legacy-Serialisierungsunterstützungs-APIs sind veraltet steht.

Ursache

Der Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, es handelt sich bei ihm nicht um einen Delegaten oder um eine Schnittstelle und eine der folgenden Bedingungen trifft zu:

  • Der Typ verfügt nicht über einen Konstruktor, der ein SerializationInfo-Objekt und ein StreamingContext-Objekt erwartet (die Signatur des Serialisierungskonstruktors).

  • Der Typ ist nicht versiegelt und der Zugriffsmodifizierer für seinen Serialisierungskonstruktor ist nicht geschützt (Familie).

  • Der Typ ist versiegelt und der Zugriffsmodifizierer für den Serialisierungskonstruktor ist nicht privat.

Regelbeschreibung

Diese Regel wird für Typen angewendet, die eine benutzerdefinierte Serialisierung unterstützen. Ein Typ unterstützt eine benutzerdefinierte Serialisierung, wenn er die ISerializable-Schnittstelle implementiert. Der Serialisierungskonstruktor ist erforderlich, um Objekte zu deserialisieren oder neu zu erstellen, die mit der ISerializable.GetObjectData-Methode serialisiert wurden.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie den Serialisierungskonstruktor. Definieren Sie den Konstruktor bei einer versiegelten Klasse als privaten Konstruktor. Definieren Sie ihn andernfalls als geschützten Konstruktor.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keinen Verstoß gegen diese Regel. Der Typ ist nicht deserialisierbar und wird in vielen Szenarios nicht funktionieren.

Beispiel

Im folgenden Beispiel wird ein Typ gezeigt, der die Regel erfüllt.

[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: ISerializable-Typen mit SerializableAttribute markieren.

Siehe auch