CA2229: implementar construtores de serialização
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Sem Quebra |
Causa
O tipo implementa a interface de ISerializable , não é um representante ou uma interface, e uma das seguintes condições for verdadeira:
O tipo não tem um construtor que usa um objeto de SerializationInfo e um objeto de StreamingContext (assinatura do construtor de serialização).
O tipo é não lacrado e o modificador de acesso para o construtor de serialização não é seguro (família).
O tipo é selado e o modificador de acesso para o construtor de serialização não será privado.
Descrição da Regra
Esta regra é relevante para os tipos que dão suporte a serialização personalizada.Um tipo oferecer suporte a serialização personalizada que implementa a interface de ISerializable .O construtor de serialização é necessário desserializar, ou recrie os objetos que foram serializado usando o método de ISerializable.GetObjectData .
Como Corrigir Violações
Para corrigir uma violação desta regra, implemente o construtor de serialização.Para uma classe selada, faça o construtor particular; se não, remova protegida.
Quando Suprimir Alertas
Não suprima uma violação da regra.O tipo não será 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: marcar tipos ISerializable com SerializableAttribute