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 9 | 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);
}
}
Regras relacionadas
CA2237: Marcar tipos ISerializable com SerializableAttribute