CA2229: Implementar os construtores de serialização
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
<strong>Categoria</strong> |
Microsoft.Usage |
Alteração significativa |
Não separável |
Causa
O tipo implementa o System.Runtime.Serialization.ISerializable interface, não é um delegado ou a interface e uma das seguintes condições for verdadeira:
O tipo não tem um construtor que leva um System.Runtime.Serialization.SerializationInfo objeto e um System.Runtime.Serialization.StreamingContext (a assinatura do construtor de serialização) do objeto.
O tipo é sem lacre e o modificador de acesso para seu construtor de serialização não protegida (família).
O tipo está lacrado e o modificador de acesso para seu construtor de serialização não é particular.
Descrição da regra
Essa regra é relevante para tipos que oferecem suporte a serialização personalizada. Um tipo oferece suporte a serialização personalizada se ele implementa o ISerializable interface. O construtor de serialização é necessária para desserializar ou recriar os objetos que tiverem sido serializados usando o ISerializable.GetObjectData método.
Como corrigir violações
Para corrigir uma violação desta regra, implemente o construtor de serialização. Para uma classe selada, tornar o construtor particular; Caso contrário, tornam protegido.
Quando suprimir avisos
Não suprimir uma violação da regra. O tipo não serão deserializable e não funcionará em muitos cenários.
Exemplo
O exemplo a seguir mostra um tipo que satisfaça a regra.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace UsageLibrary
{
[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 = (int) info.GetValue("n1", typeof(int));
}
// The following method serializes the instance.
[SecurityPermission(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Regras relacionadas
CA2237: Tipos de ISerializable de marca com o SerializableAttribute
Consulte também
Referência
System.Runtime.Serialization.ISerializable