Pergunta

Parece que eu pode serializar classes que não têm essa interface, por isso estou claro sobre o seu propósito.

Foi útil?

Solução

ISerializable é usado para fornecer serialização binário personalizado, geralmente para BinaryFormatter (e talvez para fins de comunicação remota). Sem isso, ele usa os campos, que podem ser:

  • ineficiente; se existem campos que são usados ??apenas para a eficiência em tempo de execução, mas pode ser removido para serialização (por exemplo, um dicionário pode parecer diferente quando serializado)
  • ineficiente; como até mesmo para campos que são necessários que necessita para incluir um monte de metadados adicionais
  • inválido; se existem campos que não pode ser serializado (como delegados de evento, embora eles podem ser marcados [NonSerialized])
  • quebradiços; sua serialização está agora vinculado ao campo nomes - mas os campos são destinadas a ser um detalhe de implementação; ver também Obfuscation, serialização e propriedades implementados automaticamente

Ao implementar ISerializable você pode fornecer seu próprio mecanismo de binário serialização. Note-se que o equivalente XML desta é IXmlSerializable, tal como utilizado por XmlSerializer etc.

Para fins DTO, BinaryFormatter deve ser evitado -. Coisas como xml (via XmlSerializer ou DataContractSerializer) ou JSON são bons, como são os formatos compatíveis com várias plataformas, como buffers de protocolo

Para completar, protobuf-net não inclui ganchos para ISerializable (permitindo que você use um formato binário portátil sem escrever muito código), mas BinaryFormatter não seria sua primeira escolha aqui de qualquer maneira.

Outras dicas

As aulas podem ser serializado em .NET em uma de duas maneiras:

  1. Marcação a classe com SerializableAttribute e decoração de todos os campos que você não querem ser serializado com o atributo NonSerialized. (Como observa Marc Gravell fora, BinaryFormatter, que é a classe normalmente usado para objetos formato ISerializable, serializa automaticamente todos os campos, a menos que sejam especificamente marcados de outra forma.)
  2. A implementação da interface ISerializable para totalmente serialização personalizada.

O primeiro é mais simples de usar, pois envolve simplesmente marcação declarações com atributos, mas é limitado em seu poder. Este último permite mais flexibilidade, mas leva muito mais esforço para implementar. Qual deles você deve usar depende completamente do contexto.

Quanto a este último (ISerializable) e uso, eu citou o MSDN página para a interface:

Qualquer classe que pode ser serializado deve ser marcado com o SerializableAttribute. Se uma classe precisa controlar sua serialização processo, pode implementar o ISerializable interface. o Formatter chama o GetObjectData na tempo de serialização e preenche o SerializationInfo fornecido com todos os dados necessários para representar o objeto. O formatador cria um SerializationInfo com o tipo do objeto no gráfico. Objetos que precisam para enviar proxies para si pode usar o FullTypeName e AssemblyName métodos em SerializationInfo para a mudança a informação transmitida.

No caso da herança de classe, ele é possível serializar uma classe que deriva de uma classe de base que implementos ISerializable. Nisso caso, a classe derivada deve chamar a implementação de classe base do GetObjectData dentro de seu implementação de GetObjectData. Caso contrário, os dados a partir da base classe não vai ser serializado.

Com a ISerializable você pode escrever métodos personalizados em seu objeto para assumir serialização ao fazer a serialização binária, para serializar seus objetos de uma forma diferente do que a abordagem padrão usado pelo BinaryFormatter vai fazer.

Em outras palavras, se a abordagem padrão serializa o objeto de maneira diferente de como você quer que ele serializar como, você pode implementar ISerializable para o controle completo. Note-se que de mãos dadas com ISerializable, há também um construtor personalizado você deve implementar.

XmlSerialization claro, irá apenas usar as propriedades, ISerializable tem nada a ver com a serialização XML.

Graças Marc e Pop para os comentários, eu estava um pouco apressada com minha primeira resposta.

A fim de fazer uma "transportável" objeto, você tem que serializá-lo. Por exemplo, se você quiser dados de objeto de transferência utilizando .NET Remoting ou Web Services você tem que fornecer métodos que serializa seus dados de objeto, reduzindo suas instâncias de objetos em um formato transportável que representa uma representação de alta fidelidade do objeto.

Você, então, também pode assumir a representação serializada, transportá-lo para outro contexto, como uma máquina diferente, e reconstruir o seu objeto original.

Ao implementar a interface ISerializable, uma classe deve fornecer o método GetObjectData que está incluído na interface, bem como um construtor especializado que é especializada em aceitar dois parâmetros:. Uma instância de SerializationInfo, e uma instância de StreamingContext

Se suas classes não requerem controle de grão fino de seu estado objeto, então você pode simplesmente usar atributo [Serializable]. As classes que exigem mais controle sobre o processo de serialização pode implementar a interface ISerializable.

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