Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2229 |
| Název | Implementujte serializační konstruktory |
| Kategorie | Využití |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Ne |
| Příslušné jazyky | C# a Visual Basic |
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átem ani rozhraním a jedna z následujících podmínek je pravdivá:
Typ nemá konstruktor, který přebírá objekt SerializationInfo a objekt StreamingContext (signatura 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 znovuvytvoření objektů, které byly serializovány metodou ISerializable.GetObjectData.
Jak opravit porušení
Implementací konstruktoru serializace se vyřeší porušení tohoto pravidla. Pro zapečetěnou třídu nastavte konstruktor jako soukromý, jinak ho nastavte jako 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