CA2235: Az összes nem szerializálható mező megjelölése
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA2235 |
Cím | Az összes nem szerializálható mező megjelölése |
Kategória | Használat |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
A nem szerializálható típusú példánymezők szerializálható típusban deklarálhatók.
Szabály leírása
A szerializálható típus az attribútummal System.SerializableAttribute megjelölt típus. Ha a típus szerializálva van, kivételt jelent, System.Runtime.Serialization.SerializationException ha a típus olyan példánymezőt tartalmaz, amely nem szerializálható , és nem implementálja az interfészt System.Runtime.Serialization.ISerializable .
Tipp.
A CA2235 nem aktiválja a implementálható ISerializable példánymezőket, mert saját szerializálási logikát biztosítanak.
Szabálysértések kijavítása
A szabály megsértésének kijavításához alkalmazza az System.NonSerializedAttribute attribútumot a nem szerializálható mezőre.
Mikor kell letiltani a figyelmeztetéseket?
Csak akkor tiltsa el a szabály figyelmeztetését, ha System.Runtime.Serialization.ISerializationSurrogate olyan típus van deklarálva, amely lehetővé teszi a mező példányainak szerializálását és deszerializálását.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Példa
Az alábbi példa két típust mutat be: egyet, amely megsérti a szabályt, és egyet, amely megfelel a szabálynak.
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
Remarks
A CA2235 szabály nem elemzi az ISerializable illesztőt megvalósító típusokat (kivéve, ha azokat az SerializableAttribute attribútummal is megjelöli). Ennek az az oka, hogy a CA2237 szabály már azt javasolja, hogy jelölje meg azokat a típusokat, amelyek implementálják az ISerializable interfészt az SerializableAttribute attribútummal.