Share via


CA2229: Serialisatieconstructors implementeren

Eigenschappen Weergegeven als
Regel-id CA2229
Titel Serialisatieconstructors implementeren
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nr.

Notitie

Deze regel is verwijderd in .NET 8 omdat deze conflicteert met SYSLIB0051: Verouderde serialisatie-ondersteunings-API's zijn verouderd.

Oorzaak

Het type implementeert de System.Runtime.Serialization.ISerializable interface, is geen gemachtigde of interface en een van de volgende voorwaarden is waar:

  • Het type heeft geen constructor die een SerializationInfo object en een StreamingContext object gebruikt (de handtekening van de serialisatieconstructor).

  • Het type is niet verzegeld en de toegangsmodifier voor de serialisatieconstructor is niet beveiligd (familie).

  • Het type is verzegeld en de toegangsmodifier voor de serialisatieconstructor is niet privĂ©.

Beschrijving van regel

Deze regel is relevant voor typen die ondersteuning bieden voor aangepaste serialisatie. Een type ondersteunt aangepaste serialisatie als deze de ISerializable interface implementeert. De serialisatieconstructor is vereist voor het deserialiseren of opnieuw maken van objecten die zijn geserialiseerd met behulp van de ISerializable.GetObjectData methode.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, implementeert u de serialisatieconstructor. Voor een verzegelde klasse maakt u de constructor privé; anders moet u deze beveiligen.

Wanneer waarschuwingen onderdrukken

Een schending van de regel niet onderdrukken. Het type is niet ontserialiseerd en werkt niet in veel scenario's.

Opmerking

In het volgende voorbeeld ziet u een type dat voldoet aan de regel.

[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: Mark ISerializable types with SerializableAttribute

Zie ook