CA2235:すべてのシリアル化不可能なフィールドを設定します
プロパティ | 値 |
---|---|
ルール ID | CA2235 |
Title | すべてのシリアル化不可能なフィールドを設定します |
[カテゴリ] | 使用方法 |
修正が中断ありか中断なしか | なし |
.NET 8 では既定で有効 | いいえ |
原因
シリアル化できない型のインスタンス フィールドが、シリアル化できる型で宣言されています。
規則の説明
シリアル化できる型は、System.SerializableAttribute 属性が設定されている型です。 型がシリアル化されるとき、その型に、シリアル化できない、かつ、System.Runtime.Serialization.ISerializable インターフェイスを実装しない型のインスタンス フィールドが含まれている場合、System.Runtime.Serialization.SerializationException 例外がスローされます。
ヒント
独自のシリアル化ロジックが用意されているため、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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
例
次に示すのは 2 つの型の例です。1 つは規則に違反し、1 つは規則を満たします。
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
Remarks
規則 CA2235 では、ISerializable インターフェイスを実装する型は分析されません (SerializableAttribute も設定されている場合を除きます)。 これは、規則 CA2237 で、ISerializable インターフェイスを実装する型に SerializableAttribute 属性を設定することを既に推奨しているからです。
関連規則
.NET