Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2235 |
| Název | Označte všechna neserializovatelná pole |
| Kategorie | Využití |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Ne |
| Příslušné jazyky | C# a Visual Basic |
Příčina
Neserializovatelný typ pole instance je deklarován v serializovatelném typu.
Popis pravidla
Serializovatelný typ je typ, který je označen atributem System.SerializableAttribute . Při serializaci typu je vyvolána výjimka System.Runtime.Serialization.SerializationException, pokud typ obsahuje instanční pole typu, který není serializovatelný a neimplementuje System.Runtime.Serialization.ISerializable rozhraní.
Tip
CA2235 se neaktivuje u instančních polí typů, které implementují ISerializable, protože poskytují vlastní logiku serializace.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, použijte System.NonSerializedAttribute atribut na pole, které není serializovatelné.
Kdy potlačit upozornění
Potlačit upozornění z tohoto pravidla pouze v případě, že je deklarován typ System.Runtime.Serialization.ISerializationSurrogate, který umožňuje serializaci a deserializaci instancí pole.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklad
Následující příklad ukazuje dva typy: jeden, který porušuje pravidlo, a druhý, který pravidlo splňuje.
public class Mouse(int numberOfButtons, string scanType)
{
public int NumberOfButtons { get; } = numberOfButtons;
public string ScanType { get; } = scanType;
}
[Serializable]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
readonly Mouse _opticalMouse;
public InputDevices1()
{
_opticalMouse = new Mouse(5, "optical");
}
}
[Serializable]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerialized]
readonly 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
Poznámky
Pravidlo CA2235 neanalyzuje typy, které implementují ISerializable rozhraní (pokud nejsou také označeny atributem SerializableAttribute ). Důvodem je to, že pravidlo CA2237 již doporučuje typy označení, které implementují ISerializable rozhraní s atributem SerializableAttribute .