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.