Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2235 |
| Заголовок | Пометьте все несериализуемые поля |
| Категория | Использование |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Экземпляр поля несериализуемого типа объявлен в сериализуемом типе.
Описание правила
Сериализуемый тип помечен атрибутом 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 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
Замечания
Правило CA2235 не анализирует типы, реализующие интерфейс ISerializable (если они также не помечены атрибутом SerializableAttribute). Это связано с тем, что правило CA2237 уже рекомендует помечать типы, реализующие интерфейс ISerializable с атрибутом SerializableAttribute.