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 7 No

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