CA2237: Marcar tipos ISerializable com SerializableAttribute
Property | Valor |
---|---|
ID da regra | CA2237 |
Título | Marcar tipos ISerializable com SerializableAttribute |
Categoria | Usage |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Não |
Causa
Um tipo visível externamente implementa a interface System.Runtime.Serialization.ISerializable e o tipo não é marcado com o atributo System.SerializableAttribute. A regra ignora tipos derivados cujo tipo base não é serializável.
Descrição da regra
Para ser reconhecido pelo Common Language Runtime como serializável, os tipos devem ser marcados com o atributo SerializableAttribute mesmo que o tipo use uma rotina de serialização customizada por meio da implementação da interface ISerializable.
Como corrigir violações
Para corrigir uma violação desta regra, aplique o atributo SerializableAttribute ao tipo.
Quando suprimir avisos
Não suprima um aviso dessa regra para classes de exceção, pois elas devem ser serializáveis para funcionar corretamente nos domínios de aplicativo.
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 CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
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.CA2237.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplo
O seguinte exemplo mostra um tipo que viola a regra. Remova o comentário da linha de atributo SerializableAttribute para atender à regra.
Imports System.Runtime.Serialization
Namespace ca2237
' <SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New(
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
Overridable Sub GetObjectData(
info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}