Serialisierungskonstruktoren implementieren
Aktualisiert: November 2007
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 betrifft Typen, die die benutzerdefinierte Serialisierung unterstützen. Ein Typ unterstützt die benutzerdefinierte Serialisierung, wenn er die ISerializable-Schnittstelle implementiert. Der Serialisierungskonstruktor wird benötigt, um Objekte zu deserialisieren oder neu zu erstellen, die mit der ISerializable.GetObjectData-Methode serialisiert wurden.
Behandlung 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
Markieren von ISerializable-Typen mit SerializableAttribute
Siehe auch
Referenz
System.Runtime.Serialization.ISerializable