Teilen über


CA2235: Alle nicht serialisierbaren Felder markieren.

Eigenschaft Wert
Regel-ID CA2235
Titel Alle nicht serialisierbaren Felder markieren.
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Ein Instanzenfeld eines Typs, der nicht serialisierbar ist, ist in einem serialisierbaren Typ deklariert.

Regelbeschreibung

Ein serialisierbarer Typ ist ein Typ, der mit dem Attribut System.SerializableAttribute markiert ist. Wenn der Typ serialisiert wird, wird eine System.Runtime.Serialization.SerializationException-Ausnahme ausgelöst, sofern der Typ ein Instanzfeld eines Typs enthält, der nicht serialisierbar ist und die System.Runtime.Serialization.ISerializable-Schnittstelle nicht implementiert.

Tipp

CA2235 wird für Instanzfelder von Typen, die ISerializable implementieren, nicht ausgelöst, da Sie Ihre eigene Serialisierungslogik bereitstellen.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, wenden Sie das System.NonSerializedAttribute-Attribut auf das Feld an, das nicht serialisierbar ist.

Wann sollten Warnungen unterdrückt werden?

Unterdrückt nur eine Warnung aus dieser Regel, wenn ein System.Runtime.Serialization.ISerializationSurrogate-Typ deklariert wird, mit dem Instanzen des Felds serialisiert und deserialisiert werden können.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiel

Das folgende Beispiel zeigt zwei Typen: einen der gegen die Regel verstößt, und einen der sie erfüllt.

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

Hinweise

Regel CA2235 analysiert keine Typen, die die ISerializable-Schnittstelle implementieren (es sei denn, sie sind auch mit dem SerializableAttribute-Attribut gekennzeichnet). Dies liegt daran, dass die Regel CA2237 bereits die Markierung von Typen empfiehlt, die ISerializable-Schnittstelle mit dem SerializableAttribute-Attribut implementieren.