CA2235: 모두 serialize할 수 없는 필드로 표시하십시오.

속성
규칙 ID CA2235
타이틀 모두 serialize할 수 없는 필드로 표시하십시오.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

serialize할 수 없는 형식의 인스턴스 필드가 serialize할 수 있는 형식에 정의되었습니다.

규칙 설명

직렬화할 수 있는 형식은 System.SerializableAttribute 특성으로 표시되는 형식입니다. 형식이 직렬화될 때 형식이 직렬화할 수 없는 형식의 인스턴스 필드를 포함하고 ‘또’ System.Runtime.Serialization.ISerializable 인터페이스를 구현하지 않는 경우 System.Runtime.Serialization.SerializationException 예외가 throw됩니다.

CA2235는 자체 serialization 논리를 제공하기 때문에 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가지 형식(규칙을 위반하는 형식 및 규칙을 충족하는 형식)을 보여 줍니다.

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 특성으로 표시되기도 하는 경우는 제외). 이는 규칙 CA2237ISerializable 인터페이스를 구현하는 형식을 SerializableAttribute 특성으로 표시하는 것을 이미 권장하기 때문입니다.