CA2235: помечайте все несериализуемые поля
Свойство | Значение |
---|---|
Идентификатор правила | CA2235 |
Заголовок | Пометьте все несериализуемые поля |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Экземпляр поля несериализуемого типа объявлен в сериализуемом типе.
Описание правила
Сериализуемый тип помечен атрибутом System.SerializableAttribute. При сериализации типа создается исключение System.Runtime.Serialization.SerializationException, если тип содержит поле экземпляра типа, которое не является сериализуемым и не реализует интерфейс System.Runtime.Serialization.ISerializable.
Совет
Правило CA2235 не срабатывает для полей экземпляров типов, которые реализуют ISerializable, так как они предоставляют собственную логику сериализации.
Устранение нарушений
Чтобы устранить нарушение этого правила, примените атрибут System.NonSerializedAttribute к полю, которое не является сериализуемым.
Когда лучше отключить предупреждения
Отключать предупреждения для этого правила следует только в том случае, если объявлен тип System.Runtime.Serialization.ISerializationSurrogate, позволяющий сериализовать и десериализовать экземпляры поля.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Пример
В следующем примере показан тип, который нарушает правило, и тип, который удовлетворяет ему.
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
Замечания
Правило CA2235 не анализирует типы, реализующие интерфейс ISerializable (если они также не помечены атрибутом SerializableAttribute). Это связано с тем, что правило CA2237 уже рекомендует помечать типы, реализующие интерфейс ISerializable с атрибутом SerializableAttribute.