Megosztás a következőn keresztül:


CA2229: Szerializálási konstruktorok implementálása

Tulajdonság Érték
Szabályazonosító CA2229
Cím Szerializálási konstruktorok implementálása
Kategória Használat
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Megjegyzés:

Ez a szabály azért lett eltávolítva a .NET 8-ban, mert ütközik a SYSLIB0051: Az örökölt szerializálási támogatási API-k elavultak.

Ok

A típus implementálja az System.Runtime.Serialization.ISerializable interfészt, nem delegált vagy interfész, és az alábbi feltételek egyike igaz:

  • A típus nem rendelkezik olyan konstruktorsal, amely objektumot SerializationInfo és objektumot StreamingContext (a szerializálási konstruktor aláírását) vesz igénybe.

  • A típus nincs lezárva, és a szerializálási konstruktor hozzáférési módosítója nem védett (család).

  • A típus lezárva van, és a szerializálási konstruktor hozzáférési módosítója nem privát.

Szabály leírása

Ez a szabály az egyéni szerializálást támogató típusok esetében releváns. A típus támogatja az egyéni szerializálást, ha implementálja az interfészt ISerializable . A szerializálási konstruktor szükséges a metódussal ISerializable.GetObjectData szerializált objektumok deszerializálásához vagy újbóli létrehozásához.

Szabálysértések kijavítása

A szabály megsértésének kijavításához implementálja a szerializálási konstruktort. Zárt osztály esetén tegye magánjellegűvé a konstruktort; ellenkező esetben tegye védetté.

Mikor kell letiltani a figyelmeztetéseket?

Ne tiltsa el a szabály megsértését. A típus nem lesz deszerializálható, és sok esetben nem fog működni.

Példa

Az alábbi példa egy olyan típust mutat be, amely megfelel a szabálynak.

[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: ISerializable-típusok megjelölése a SerializableAttribute használatával

Kapcsolódó információk