CA2235: Należy oznaczyć wszystkie nieserializowane pola
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2235 |
Tytuł | Oznacz wszystkie pola nieprzeznaczone do serializacji |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Pola wystąpienia typu, który nie może być serializowany, jest zadeklarowany w typie, który jest możliwy do serializacji.
Opis reguły
Typ z możliwością serializacji jest taki, który jest oznaczony atrybutem System.SerializableAttribute . Gdy typ jest serializowany, zgłaszany jest wyjątek, System.Runtime.Serialization.SerializationException jeśli typ zawiera pole wystąpienia typu, który nie można serializować i nie implementuje interfejsu System.Runtime.Serialization.ISerializable .
Napiwek
CA2235 nie jest uruchamiany dla pól wystąpień typów implementujących ISerializable , ponieważ zapewniają własną logikę serializacji.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zastosuj System.NonSerializedAttribute atrybut do pola, które nie można serializować.
Kiedy pomijać ostrzeżenia
Pomijanie ostrzeżenia z tej reguły tylko wtedy, gdy System.Runtime.Serialization.ISerializationSurrogate typ jest zadeklarowany, który umożliwia serializacji i deserializacji wystąpień pola.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie przedstawiono dwa typy: jeden, który narusza regułę, i jeden, który spełnia regułę.
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
Uwagi
Reguła CA2235 nie analizuje typów implementujących ISerializable interfejs (chyba że są one również oznaczone atrybutem SerializableAttribute ). Dzieje się tak, ponieważ reguła CA2237 już zaleca oznaczanie typów implementujących ISerializable interfejs z atrybutem SerializableAttribute .