Delen via


CA2235: alle niet-serialiseerbare velden markeren

Eigenschappen Weergegeven als
Regel-id CA2235
Titel Alle niet-serialiseerbare velden markeren
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een exemplaarveld van een type dat niet serialiseerbare is, wordt gedeclareerd in een type dat serialiseerbaar is.

Beschrijving van regel

Een serialiseerbaar type is een type dat is gemarkeerd met het System.SerializableAttribute kenmerk. Wanneer het type wordt geserialiseerd, wordt er een System.Runtime.Serialization.SerializationException uitzondering gegenereerd als het type een exemplaarveld bevat van een type dat niet serialiseerbaar is en de System.Runtime.Serialization.ISerializable interface niet implementeert.

Tip

CA2235 wordt niet geactiveerd voor exemplaarvelden van typen die worden geïmplementeerd ISerializable omdat ze hun eigen serialisatielogica bieden.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, past u het System.NonSerializedAttribute kenmerk toe op het veld dat niet serialiseerbaar is.

Wanneer waarschuwingen onderdrukken

Onderdrukt alleen een waarschuwing van deze regel als een System.Runtime.Serialization.ISerializationSurrogate type wordt gedeclareerd waarmee exemplaren van het veld kunnen worden geserialiseerd en gedeserialiseerd.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Opmerking

In het volgende voorbeeld ziet u twee typen: een die de regel schendt en een die voldoet aan de regel.

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

Opmerkingen

Regel CA2235 analyseert geen typen die de ISerializable interface implementeren (tenzij ze ook zijn gemarkeerd met het SerializableAttribute kenmerk). Dit komt doordat regel CA2237 al markeringstypen aanbeveelt die de ISerializable interface met het SerializableAttribute kenmerk implementeren.