Pergunta

Qual é a diferença entre usar o Serializable atribuir e implementar o ISerializable interface?

Foi útil?

Solução

Quando você usa o SerializableAttribute Atributo Você está colocando um atributo em um campo em tempo de compilação de tal maneira que, quando estiver em tempo de execução, as instalações serializadas saberão o que serializar com base nos atributos, realizando reflexão no tipo de classe/módulo/montagem.

[Serializable]
public class MyFoo { … }

O acima indica que a instalação em serialização deve serializar em serializar toda a classe MyFoo, enquanto:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

Usando o atributo, você pode escolher seletivamente quais campos precisam ser serializados.

Quando você implementa o ISerializable interface, a serialização é efetivamente substituída por uma versão personalizada, substituindo GetObjectData e SetObjectData (e fornecendo um construtor da forma MyFoo(SerializationInfo info, StreamingContext context)), haveria um grau mais fino de controle sobre a serialização dos dados.

Veja também Este exemplo de uma serialização personalizada aqui no Stackoverflow. Ele mostra como manter a serialização compatível com as versões diferentes dos dados serializados.

Espero que isto ajude.

Outras dicas

o Serializableattribute Instrui a estrutura para fazer o processo de serialização padrão. Se você precisar de mais controle, pode implementar o Interface iserializável. Então você colocaria o seu próprio código para serializar o objeto no GetObjectData método e atualize o SerializationInfo objeto que é passado para ele.

o ISerializable A interface permite que você implemente serialização personalizada exceto o padrão. Quando você implementa o ISerializable interface, você tem que substituir GetObjectData Método da seguinte maneira

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

O iserialize force você a implementar a lógica de serialização manialmente, enquanto a marcação por atributo serializável (você quis dizer isso?) Dirá ao serializador binário que essa classe pode ser serializada. Isso fará isso automaticamente.

A herdeira da iserializable permite que você implemente a (DE) serialização. Ao usar apenas o atributo serializável, a serialização (DE) pode ser controlada apenas por atributos e é menos flexível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top