CA2235: Markera alla fält som inte kan serialiseras
Property | Värde |
---|---|
Regel-ID | CA2235 |
Title | Markera alla fält som inte kan serialiseras |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | 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
Kommentarer
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.