Exportar (0) Imprimir
Expandir Tudo
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original

Interface ISerializable

Permite que um objeto controle a sua própria serialização e desserialização.

Namespace:  System.Runtime.Serialization
Assembly:  mscorlib (em mscorlib.dll)

[ComVisibleAttribute(true)]
public interface ISerializable

O tipo ISerializable expõe os membros a seguir.

  NomeDescrição
Método públicoGetObjectDataPreenche uma SerializationInfo com os dados necessários para serializar o objeto de destino.
Superior

Qualquer classe que pode ser serializado deve ser marcada com o SerializableAttribute. Se precisar de uma classe controlar seu processo de serialização, pode implementar a ISerializable interface. O Formatter chamadas de GetObjectData em tempo de serialização e preenche o fornecido SerializationInfo com todos os dados necessários para representar o objeto. O Formatter cria um SerializationInfo com o tipo do objeto no gráfico. Objetos que precisam enviar proxies próprios podem usar o FullTypeName e AssemblyName métodos em SerializationInfo para alterar as informações transmitidas.

No caso de herança da classe, é possível serializar uma classe que derive de uma classe base que implementa ISerializable. Nesse caso, a classe derivada deve chamar a implementação de GetObjectData da classe base usando sua implementação de GetObjectData. Caso contrário, os dados da classe base não serão serializados.

O ISerializable interface implica um construtor com o construtor de assinatura (SerializationInfo informações, StreamingContext contexto). Durante a desserialização, o construtor atual é chamado somente após os dados a SerializationInfo tem sido desserializados pelo formatador. Em geral, esse construtor deve ser protegido se a classe não é sealed.

A ordem na qual os objetos são desserializados não pode ser garantida. Por exemplo, se um tipo faz referência a um tipo que não tenha sido desserializado ainda, uma exceção ocorrerá. Se você estiver criando tipos que possuem tais dependências, você pode contornar o problema implementando a IDeserializationCallback interface e o OnDeserialization método.

A arquitetura de serialização trata tipos de objeto que se estendem MarshalByRefObject os mesmos tipos que estendem Object. Esses tipos podem ser marcados com o SerializableAttribute e implementar a ISerializable interface como qualquer outro tipo de objeto. Estado do objeto será capturado e mantido o fluxo.

Quando esses tipos estão sendo usados por meio de System.Runtime.Remoting, a infra-estrutura de remoting fornece um substituto que ocupe o lugar de serialização típica e em vez disso serializa um proxy para o MarshalByRefObject. Um substituto é um auxiliar que sabe como serializar e desserializar objetos de um tipo específico. O proxy, invisível para o usuário na maioria dos casos, será do tipo ObjRef.

Como um padrão de design geral, seria incomum para uma classe ser marcado com o atributo serializable e estender MarshalByRefObject. Os desenvolvedores devem pensar com cuidado os possíveis cenários de serialização e remoting ao combinar essas duas características. Um exemplo que isso pode ser aplicável é com um MemoryStream. Enquanto a classe base de MemoryStream (Stream) que se estende do MarshalByRefObject, é possível capturar o estado de um MemoryStream e restaurá-lo à vontade. Portanto, talvez, seja significativo para serializar o estado de fluxo em um banco de dados e restaurá-lo em um momento posterior no tempo. No entanto, quando usado por meio de comunicação remota, um objeto desse tipo seria intermediadas por proxy.

Para obter mais informações sobre a serialização de classes que estendem MarshalByRefObject, consulte RemotingSurrogateSelector. Para obter mais informações sobre como implementar ISerializable, consulte Serialização personalizada.

Observações para implementadores

Implemente essa interface para permitir que um objeto podem tomar parte em sua própria serialização e desserialização.

O exemplo de código a seguir demonstra o uso da ISerializable interface para definir o comportamento de serialização personalizada para uma classe.


using System;
using System.Text;
using System.IO;
// Add references to Soap and Binary formatters.
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap ;
using System.Runtime.Serialization;


[Serializable]
public class MyItemType : ISerializable
{
    public MyItemType()
    {
        // Empty constructor required to compile.
    }

    // The value to serialize.
    private string myProperty_value;

    public string MyProperty
    {
        get { return myProperty_value; }
        set { myProperty_value = value; }
    }

    // Implement this method to serialize data. The method is called 
    // on serialization.
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        // Use the AddValue method to specify serialized values.
        info.AddValue("props", myProperty_value, typeof(string));

    }

    // The special constructor is used to deserialize values.
    public MyItemType(SerializationInfo info, StreamingContext context)
    {
        // Reset the property value using the GetValue method.
        myProperty_value = (string) info.GetValue("props", typeof(string));
    }
}

// This is a console application. 
public static class Test
{
    static void Main()
    {
        // This is the name of the file holding the data. You can use any file extension you like.
        string fileName = "dataStuff.myData";

        // Use a BinaryFormatter or SoapFormatter.
        IFormatter formatter = new BinaryFormatter();
        //IFormatter formatter = new SoapFormatter();

        Test.SerializeItem(fileName, formatter); // Serialize an instance of the class.
        Test.DeserializeItem(fileName, formatter); // Deserialize the instance.
        Console.WriteLine("Done");
        Console.ReadLine();
    }

    public static void SerializeItem(string fileName, IFormatter formatter)
    {
        // Create an instance of the type and serialize it.
        MyItemType t = new MyItemType();
        t.MyProperty = "Hello World";

        FileStream s = new FileStream(fileName , FileMode.Create);
        formatter.Serialize(s, t);            
        s.Close();
    }


    public static void DeserializeItem(string fileName, IFormatter formatter)
    {
        FileStream s = new FileStream(fileName, FileMode.Open);
        MyItemType t = (MyItemType)formatter.Deserialize(s);
        Console.WriteLine(t.MyProperty);            
    }       
}


.NET Framework

Com suporte em: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Com suporte em: 4, 3.5 SP1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Função Server Core sem suporte), Windows Server 2008 R2 (Função Server Core com suporte com o SP1 ou posterior, Itanium sem suporte)

O .NET Framework não oferece suporte a todas as versões de cada plataforma. Para obter uma lista das versões com suporte, consulte Requisitos do sistema do .NET Framework.

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2015 Microsoft