CA2229: Implementovat serializační konstruktory
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2229 |
Název | Implementujte serializační konstruktory |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | No |
Poznámka:
Toto pravidlo bylo odebráno v rozhraní .NET 8, protože je v konfliktu s SYSLIB0051: Starší verze rozhraní API podpory serializace jsou zastaralá.
Příčina
Typ implementuje System.Runtime.Serialization.ISerializable rozhraní, není delegát nebo rozhraní a jedna z následujících podmínek je pravdivá:
Typ nemá konstruktor, který přebírá SerializationInfo objekt a StreamingContext objekt (podpis konstruktoru serializace).
Typ je nezapečetěný a modifikátor přístupu pro jeho serializační konstruktor není chráněn (rodina).
Typ je zapečetěn a modifikátor přístupu pro jeho serializační konstruktor není soukromý.
Popis pravidla
Toto pravidlo je relevantní pro typy, které podporují vlastní serializaci. Typ podporuje vlastní serializaci, pokud implementuje ISerializable rozhraní. Serializační konstruktor je vyžadován k deserializaci nebo znovu vytvořit objekty, které byly serializovány pomocí ISerializable.GetObjectData metody.
Jak opravit porušení
Implementací konstruktoru serializace se vyřeší porušení tohoto pravidla. Pro zapečetěnou třídu musí být konstruktor soukromý. V ostatních případech musí být chráněný.
Kdy potlačit upozornění
Nepotlačujte porušení pravidla. Typ nebude deserializovatelný a nebude fungovat v mnoha scénářích.
Příklad
Následující příklad ukazuje typ, který splňuje pravidlo.
[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);
}
}
Související pravidla
CA2237: Označte typy ISerializable pomocí SerializableAttribute