CA2235:标记所有不可序列化的字段

属性
规则 ID CA2235
标题 标记所有不可序列化的字段
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

在可以序列化的类型中声明了类型不可序列化的实例字段。

规则说明

可序列化的类型是标记有 System.SerializableAttribute 特性的类型。 序列化类型时,如果该类型包含不可序列化且不可实现 System.Runtime.Serialization.ISerializable 接口的类型的实例字段,则将引发 System.Runtime.Serialization.SerializationException 异常。

提示

对于实现 ISerializable 的类型的实例字段,不会触发 CA2235,因为它们提供了自己的序列化逻辑。

如何解决冲突

若要解决与此规则的冲突,请将 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 已建议使用 SerializableAttribute 特性来标记实现 ISerializable 接口的类型。