CA2235: alle niet-serialiseerbare velden markeren

Eigenschap Waarde
Regel-id CA2235
Titel Alle niet-serialiseerbare velden markeren
Categorie Gebruik
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Nee
Toepasselijke talen C# en Visual Basic

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 ISerializable implementeren, omdat ze hun eigen serialisatielogica bieden.

Hoe schendingen op te lossen

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

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

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 voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Voorbeeld

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

public class Mouse(int numberOfButtons, string scanType)
{
    public int NumberOfButtons { get; } = numberOfButtons;
    public string ScanType { get; } = scanType;
}

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

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

[Serializable]
public class InputDevices2
{
    // Satisfies MarkAllNonSerializableFields.
    [NonSerialized]
    readonly 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.