Share via


CA2229: Implementera serialiseringskonstruktorer

Property Värde
Regel-ID CA2229
Rubrik Implementera serialiseringskonstruktorer
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Kommentar

Den här regeln togs bort i .NET 8 eftersom den står i konflikt med SYSLIB0051: API:er för äldre serialiseringsstöd är föråldrade.

Orsak

Typen implementerar System.Runtime.Serialization.ISerializable gränssnittet, är inte ett ombud eller gränssnitt och något av följande villkor är sant:

  • Typen har ingen konstruktor som tar ett SerializationInfo objekt och ett StreamingContext objekt (serialiseringskonstruktorns signatur).

  • Typen är oförseglat och åtkomstmodifieraren för dess serialiseringskonstruktor är inte skyddad (familj).

  • Typen är förseglad och åtkomstmodifieraren för dess serialiseringskonstruktor är inte privat.

Regelbeskrivning

Den här regeln är relevant för typer som stöder anpassad serialisering. En typ stöder anpassad serialisering om den ISerializable implementerar gränssnittet. Serialiseringskonstruktorn krävs för att deserialisera eller återskapa objekt som har serialiserats med hjälp av ISerializable.GetObjectData metoden.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln implementerar du serialiseringskonstruktorn. För en förseglad klass gör du konstruktorn privat; annars gör du det skyddat.

När du ska ignorera varningar

Undertryck inte en överträdelse av regeln. Typen kommer inte att vara deserializable och fungerar inte i många scenarier.

Exempel

I följande exempel visas en typ som uppfyller regeln.

[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: Markera ISerializable-typer med SerializableAttribute

Se även