Partilhar via


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 Utilização
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

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

Descrição da regra

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

Gorjeta

O CA2235 não dispara, por exemplo, campos de tipos que implementam ISerializable porque eles fornecem sua própria lógica de serialização.

Como corrigir violações

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

Quando suprimir avisos

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

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Exemplo

O exemplo a seguir mostra dois tipos: um que viola a regra e outro 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

Observações

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