Compartilhar via


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

Consulte também

Referência

ISerializable

SerializationInfo

StreamingContext