Qual é a diferença entre usar o atributo serializável e implementar iserializable?
-
23-09-2019 - |
Pergunta
Qual é a diferença entre usar o Serializable
atribuir e implementar o ISerializable
interface?
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 (e fornecendo um construtor da forma SetObjectData
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.