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.