Share via


CA2235: Markera alla fält som inte kan serialiseras

Property Värde
Regel-ID CA2235
Rubrik Markera alla fält som inte kan serialiseras
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Ett instansfält av en typ som inte är serialiserbar deklareras i en typ som är serialiserbar.

Regelbeskrivning

En serialiserbar typ är en typ som är markerad med attributet System.SerializableAttribute . När typen serialiseras utlöses ett System.Runtime.Serialization.SerializationException undantag om typen innehåller ett instansfält av en typ som inte är serialiserbar och inte implementerar System.Runtime.Serialization.ISerializable gränssnittet.

Dricks

CA2235 utlöses inte för instansfält av typer som implementeras ISerializable eftersom de tillhandahåller sin egen serialiseringslogik.

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

Om du vill åtgärda en överträdelse av den här regeln tillämpar du System.NonSerializedAttribute attributet på det fält som inte är serialiserbart.

När du ska ignorera varningar

Utelämna endast en varning från den här regeln om en System.Runtime.Serialization.ISerializationSurrogate typ deklareras som tillåter att instanser av fältet serialiseras och deserialiseras.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

I följande exempel visas två typer: en som bryter mot regeln och en som uppfyller regeln.

public class Mouse
{
    int buttons;
    string scanTypeValue;

    public int NumberOfButtons
    {
        get { return buttons; }
    }

    public string ScanType
    {
        get { return scanTypeValue; }
    }

    public Mouse(int numberOfButtons, string scanType)
    {
        buttons = numberOfButtons;
        scanTypeValue = scanType;
    }
}

[Serializable]
public class InputDevices1
{
    // Violates MarkAllNonSerializableFields.
    Mouse opticalMouse;

    public InputDevices1()
    {
        opticalMouse = new Mouse(5, "optical");
    }
}

[Serializable]
public class InputDevices2
{
    // Satisfies MarkAllNonSerializableFields.
    [NonSerialized]
    Mouse opticalMouse;

    public InputDevices2()
    {
        opticalMouse = new Mouse(5, "optical");
    }
}
Imports System
Imports System.Runtime.Serialization

Namespace ca2235

    Public Class Mouse

        ReadOnly Property NumberOfButtons As Integer

        ReadOnly Property ScanType As String

        Sub New(numberOfButtons As Integer, scanType As String)
            Me.NumberOfButtons = numberOfButtons
            Me.ScanType = scanType
        End Sub

    End Class

    <SerializableAttribute>
    Public Class InputDevices1

        ' Violates MarkAllNonSerializableFields.
        Dim opticalMouse As Mouse

        Sub New()
            opticalMouse = New Mouse(5, "optical")
        End Sub

    End Class

    <SerializableAttribute>
    Public Class InputDevices2

        ' Satisfies MarkAllNonSerializableFields.
        <NonSerializedAttribute>
        Dim opticalMouse As Mouse

        Sub New()
            opticalMouse = New Mouse(5, "optical")
        End Sub

    End Class

End Namespace

Anmärkningar

Regel CA2235 analyserar inte typer som implementerar ISerializable gränssnittet (såvida de inte också är markerade med SerializableAttribute attributet). Det beror på att regeln CA2237 redan rekommenderar märkningstyper som implementerar ISerializable gränssnittet med SerializableAttribute attributet.