CA2229: Implementar construtores de serialização
Property | valor |
---|---|
ID da regra | CA2229 |
Título | Implementar construtores de serialização |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Não |
Nota
Esta regra foi removida no .NET 8 porque está em conflito com SYSLIB0051: APIs de suporte à serialização herdada estão obsoletas.
Motivo
O tipo implementa a System.Runtime.Serialization.ISerializable interface, não é um delegado ou interface, e uma das seguintes condições é verdadeira:
O tipo não tem um construtor que leva um SerializationInfo objeto e um StreamingContext objeto (a assinatura do construtor de serialização).
O tipo é deslacrado e o modificador de acesso para seu construtor de serialização não está protegido (família).
O tipo é selado e o modificador de acesso para seu construtor de serialização não é privado.
Descrição da regra
Esta regra é relevante para tipos que oferecem suporte à serialização personalizada. Um tipo suporta serialização personalizada se implementar a ISerializable interface. O construtor de serialização é necessário para desserializar, ou recriar, objetos que foram serializados usando o ISerializable.GetObjectData método.
Como corrigir violações
Para corrigir uma violação dessa regra, implemente o construtor de serialização. Para uma classe selada, torne o construtor privado; caso contrário, torne-o protegido.
Quando suprimir avisos
Não reprima 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 conexas
CA2237: Marcar tipos ISerializable com SerializableAttribute