CA2229: Serialisierungskonstruktoren implementieren
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Kategorie |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Der Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, ist kein Delegat bzw. keine Schnittstelle, und eine der folgenden Bedingungen ist erfüllt:
Der Typ verfügt über keinen Konstruktor, der ein System.Runtime.Serialization.SerializationInfo-Objekt und ein System.Runtime.Serialization.StreamingContext-Objekt (die Signatur des Serialisierungskonstruktors) annimmt.
Der Typ ist unversiegelt, und der Zugriffsmodifizierer für seinen Serialisierungskonstruktor ist nicht geschützt (Familie).
Der Typ ist versiegelt, und der Zugriffsmodifizierer für seinen Serialisierungskonstruktor ist nicht privat.
Regelbeschreibung
Diese Regel ist relevant für Typen, die die benutzerdefinierte Serialisierung unterstützen. Ein Typ unterstützt benutzerdefinierte Serialisierung, wenn durch ihn die ISerializable-Schnittstelle implementiert wird. Der Serialisierungskonstruktor wird benötigt, 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 dann nämlich nicht deserialisierbar und funktioniert in vielen Szenarien nicht.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der der Regel entspricht.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace UsageLibrary
{
[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 = (int) info.GetValue("n1", typeof(int));
}
// The following method serializes the instance.
[SecurityPermission(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Verwandte Regeln
CA2237: Markieren von ISerializable-Typen mit SerializableAttribute
Siehe auch
Referenz
System.Runtime.Serialization.ISerializable