Compartilhar via


CA2229: Implementar construtores de serialização

Property Valor
ID da regra CA2229
Título Implementar construtores de serialização
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 10 Não

Observação

Essa regra foi removida do .NET 8 porque entra em conflito com o aviso SYSLIB0051: as APIs de suporte de serialização herdadas estão obsoletas.

Causa

O tipo implementa a interface System.Runtime.Serialization.ISerializable, não é um representante ou interface e uma das seguintes condições é verdadeira:

  • O tipo não tem um construtor que usa um objeto SerializationInfo e um objeto StreamingContext (a assinatura do construtor de serialização).

  • O tipo não está selado e o modificador de acesso para seu construtor de serialização não está protegido (família).

  • O tipo está selado e o modificador de acesso para seu construtor de serialização não é privado.

Descrição da regra

Essa regra é relevante para tipos que dão suporte à serialização personalizada. Um tipo dá suporte à serialização personalizada se implementar a interface ISerializable. O construtor de serialização é necessário para desserializar ou recriar objetos que foram serializados usando o método ISerializable.GetObjectData.

Como corrigir violações

Para corrigir uma violação dessa regra, implemente o construtor de serialização. Para uma classe lacrada, torne o construtor particular; do contrário, deixe-o protegido.

Quando suprimir avisos

Não suprime uma violação da regra. O tipo não será desserializável e não funcionará em muitos cenários.

Exemplo

O exemplo a seguir mostra um tipo que satisfaz a regra.

[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
    private int n1;

    // This is a regular constructor.
    public SerializationConstructorsRequired()
    {
        n1 = -1;
    }
    // This is the serialization constructor.
    // Satisfies rule: ImplementSerializationConstructors.

    protected SerializationConstructorsRequired(
       SerializationInfo info,
       StreamingContext context)
    {
        n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
            (int)info.GetValue(nameof(n1), typeof(int))! :
            -1;
    }

    // The following method serializes the instance.
    void ISerializable.GetObjectData(SerializationInfo info,
       StreamingContext context)
    {
        info.AddValue(nameof(n1), n1);
    }
}

CA2237: Marcar tipos ISerializable com SerializableAttribute

Confira também