Pergunta

Se você tiver uma instância de objeto A que faz referência a outros objetos (por exemplo, instâncias B e C) e serializar A em um arquivo binário, o que acontece?Agora você tem dados serializados que incluem A, B e C?

Como funciona exatamente?O que vou receber se desserializar os dados?A, B e C ??

(Sinta-se à vontade para incluir explicações de funcionamento interno também).

Foi útil?

Solução

Todas as referências a outros objetos também serão serializadas. Se você desserializar os dados, obterá um conjunto completo de trabalho de seus dados, incluindo os objetos A, B e C. Esse é provavelmente o principal benefício da serialização binária, em oposição à serialização XML.

Se qualquer uma das outras classes para as quais seu objeto contém uma referência não estiver marcada com atributo [Serializable] , você obterá um SerializationException em tempo de execução (cuja imagem foi descaradamente roubada da web; os erros de tempo de execução nem se parecem mais com isso nas versões atuais do VS):

Exemplo de uma SerializationException não tratada

Além disso, não tenho certeza de quais "coisas internas" você esperava entender. A serialização usa reflexão para percorrer os campos público e privado de objetos, convertendo em um fluxo de bytes, que são gravados em um fluxo de dados. Durante a desserialização, ocorre o inverso: um fluxo de bytes é lido do fluxo de dados, que é usado para sintetizar uma réplica exata do objeto, junto com as informações de tipo. Todos os campos no objeto têm os mesmos valores que possuíam antes; o construtor não é chamado quando um objeto é desserializado. A maneira mais fácil de pensar nisso é que você está simplesmente tirando um instantâneo no local do objeto, que pode restaurar ao seu estado original à vontade.

A classe responsável pela serialização e desserialização reais é chamada de formatador (sempre herda de interface IFormatter ). Seu trabalho é gerar um "gráfico de objeto", que é uma árvore generalizada contendo o objeto que está sendo serializado / desserializado como sua raiz. Conforme mencionado acima, o formatador usa reflexão para percorrer este gráfico de objeto, serializando / desserializando todas as referências de objeto contidas por aquele objeto. O formatador também é inteligente o suficiente para saber como não serializar nenhum objeto no gráfico mais de uma vez. Se duas referências de objeto realmente apontarem para o mesmo objeto, isso será detectado e esse objeto será serializado apenas uma vez. Esta e outras lógicas evitam a entrada em um loop infinito.

Claro, é fácil ter um bom entendimento geral de como esse processo funciona. É muito mais difícil realmente escrever o código que o implementa sozinho. Felizmente, isso já foi feito para você. Parte do objetivo do .NET Framework é que toda essa complicada lógica de serialização está embutida, deixando você livre de se preocupar com isso. Eu não pretendo entender tudo isso sozinho, e você certamente também não precisa fazer isso para aproveitar ao máximo a funcionalidade que ele oferece. Anos escrevendo todo aquele código à mão finalmente acabaram. Você deve se alegrar, em vez de se preocupar com os detalhes da implementação. :-)

Outras dicas

Em primeiro lugar, o tipo do objeto A deve ser marcado com o atributo [Serializable].A serialização de A serializará todos os dados de seus membros, privados ou públicos, desde que os tipos dos membros também estejam marcados com [Serializable] (ou para usar seu exemplo, desde que os tipos de B e C estejam marcados [Serializable]).As tentativas de serializar dados, direta ou indiretamente, de um tipo que não seja [Serializável] resultarão em uma exceção.

Vários tipos .NET integrados já estão marcados como [Serializable], incluindo System.Int32 (int), System.Boolean (bool), etc.

Você pode ler mais sobre serialização .NET aqui: http:// msdn.microsoft.com/en-us/library/4abbf6k0.aspx .

Os objetos referidos pelo objeto principal também devem ser [Serializáveis].Fornecer isso tudo é feito automaticamente pelo formatador.

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