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.