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);
}
}
Ähnliche Regeln
CA2237: ISerializable-Typen mit SerializableAttribute markieren.