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 接口的类型。