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 9 | 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.