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);
    }
}

CA2237: Označte typy ISerializable pomocí SerializableAttribute

Viz také