CA2235: помечайте все несериализуемые поля

Свойство Значение
Идентификатор правила CA2235
Заголовок Пометьте все несериализуемые поля
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 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.