CA2235: Marcar todos os campos não serializáveis

Property Valor
ID da regra CA2235
Título Marcar todos os campos não serializáveis
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Um campo de instância de um tipo que não seja serializável é declarado em um tipo que é serializável.

Descrição da regra

Um tipo serializável é aquele marcado com o atributo System.SerializableAttribute. Quando o tipo é serializado, uma exceção System.Runtime.Serialization.SerializationException é gerada se o tipo contém um campo de instância de um tipo que não é serializável e não implementa a interface System.Runtime.Serialization.ISerializable.

Dica

O CA2235 não é acionado para campos de instância de tipos que implementam ISerializable porque fornecem sua própria lógica de serialização.

Como corrigir violações

Para corrigir uma violação dessa regra, aplique o atributo System.NonSerializedAttribute ao campo que não é serializável.

Quando suprimir avisos

Suprime apenas um aviso dessa regra se um tipo System.Runtime.Serialization.ISerializationSurrogate for declarado que permita que instâncias do campo sejam serializadas e desserializadas.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Exemplo

O exemplo a seguir mostra dois métodos: um que viola a regra e um que satisfaz a regra.

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

Comentários

A regra CA2235 não analisa tipos que implementam a interface ISerializable (a menos que também sejam marcados com o atributo SerializableAttribute). Isso ocorre porque a regra CA2237 já recomenda a marcação de tipos que implementam a interface ISerializable com o atributo SerializableAttribute.