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 属性を設定することを既に推奨しているからです。