Partilhar via


CA2237: Marcar tipos ISerializable com SerializableAttribute

Propriedade valor
ID da regra CA2237
Cargo Marcar tipos ISerializable com SerializableAttribute
Categoria Utilização
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Um tipo visível externamente implementa a System.Runtime.Serialization.ISerializable interface e o tipo não é marcado com o System.SerializableAttribute atributo. A regra ignora tipos derivados cujo tipo base não é serializável.

Descrição da regra

Para serem reconhecidos pelo common language runtime como serializáveis, os tipos devem ser marcados com o atributo mesmo que o SerializableAttribute tipo use uma rotina de serialização personalizada por meio da implementação da ISerializable interface.

Como corrigir violações

Para corrigir uma violação dessa regra, aplique o SerializableAttribute atributo ao tipo.

Quando suprimir avisos

Não suprima um aviso dessa regra para classes de exceção, porque elas devem ser serializáveis para funcionar corretamente entre domínios de aplicativo.

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 CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Exemplo

O exemplo a seguir mostra um tipo que viola a regra. Descomente a linha de atributo para satisfazer a SerializableAttribute 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);
    }
}