CA2235: помечайте все несериализуемые поля
TypeName |
MarkAllNonSerializableFields |
CheckId |
CA2235 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Экземпляр поля несериализуемого типа объявлен в сериализуемом типе.
Описание правила
Сериализуемый тип — это тип, помеченный атрибутом SerializableAttribute.При сериализации этого типа возникает исключение SerializationException, если тип содержит поле экземпляра несериализуемого типа.
Устранение нарушений
Чтобы устранить нарушение этого правила, примените атрибут NonSerializedAttribute к несериализуемому полю.
Отключение предупреждений
Отключать предупреждения этого правила следует только при объявлении типа ISerializationSurrogate, позволяющего сериализовать и десериализовать экземпляры поля.
Пример
В следующем примере показан тип, который нарушает данное правило, и тип, удовлетворяющий ему.
Imports System
Imports System.Runtime.Serialization
Namespace UsageLibrary
Public Class Mouse
Dim buttons As Integer
Dim scanTypeValue As String
ReadOnly Property NumberOfButtons As Integer
Get
Return buttons
End Get
End Property
ReadOnly Property ScanType As String
Get
Return scanTypeValue
End Get
End Property
Sub New(numberOfButtons As Integer, scanType As String)
buttons = numberOfButtons
scanTypeValue = 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
using System;
using System.Runtime.Serialization;
namespace UsageLibrary
{
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;
}
}
[SerializableAttribute]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
Mouse opticalMouse;
public InputDevices1()
{
opticalMouse = new Mouse(5, "optical");
}
}
[SerializableAttribute]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerializedAttribute]
Mouse opticalMouse;
public InputDevices2()
{
opticalMouse = new Mouse(5, "optical");
}
}
}
Связанные правила
CA2236: вызывайте методы базового класса для типов ISerializable
CA2240: правильно реализуйте ISerializable
CA2229: применяйте конструкторы сериализации
CA2238: следует правильно реализовывать методы сериализации
CA2237: пометьте типы ISerializable атрибутом SerializableAttribute
CA2239: предоставляйте методы десериализации для необязательных полей