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 8 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
Imports System.Runtime.Serialization
Imports System.Security.Permissions

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);
    }
}