Articles

How Deserialization Process Happen in Java?

Posted by admin

In one of my previous post related to “Implementing Serializable interface in java”, Mr. bito asked a good question “at the time of the deserializtion, how the JVM creates the object without calling the constructor??”. Eu pensei em responder-lhe no mesmo post em um comentário, mas em outro momento eu pensei nisso um tópico muito interessante que requer um artigo detalhado separado, bem como a discussão com vocês., Então, aqui estou iniciando a discussão com meu conhecimento limitado neste tópico e vou encorajá-los a colocar seus pensamentos/consultas para que este tópico fique claro para todos nós. Aqui vou eu começar.

Nós já cobrimos muitas coisas relacionadas à serialização em java, e algumas coisas relacionadas à deserialização em java também. Eu não vou novamente re-iterar a mesma coisa novamente e diretamente chegar ao tema principal de discussão, ou seja, como a deserialização funciona em Java?

Deserialização é o processo pelo qual o objeto previamente serializado é reconstruído de volta em sua forma original., instância do objecto. A entrada para o processo de deserialização é o fluxo de bytes que passamos pelo outro extremo da rede ou simplesmente o lemos a partir do sistema de arquivos/banco de dados. Uma pergunta surge imediatamente, o que está escrito dentro desta corrente de bytes?

Leia Mais: Mini-guia para implementar a interface serializable

Para ser muito precisa, esta corrente de bytes (ou dizer de dados serializados) tem todas as informações sobre a instância que foi produzido pelo processo de serialização., Esta informação inclui meta-dados da classe, tipo de informação de campos de instância e valores de campos de instância também. Esta mesma informação é necessária quando o objeto é reconstruído de volta para uma nova instância de objeto. Enquanto deserializa um objeto, o JVM lê seus metadados de classe a partir do fluxo de bytes que especifica se a classe de um objeto implementa ou ‘serializável’ ou ‘Externalizável’ interface.,

por favor note que para que a deserialização aconteça sem problemas, o bytecode de uma classe, cujo objeto está sendo deserializado, deve estar presente dentro do JVM executando a deserialização. Caso contrário, a “excepção não encontrada” é lançada. Não é demasiado óbvio ??

Se a instância implementa a interface serializável, então uma instância da classe é criada sem invocar que é qualquer construtor. Sério? então como o objeto é criado se não construtor é chamado?

Let’s look at the bytecode of a simple eprogram:

Above bytecode looks real stuff, isn’t it?, Na nossa primeira linha, vamos empurrar um valor da “tabela variável local” para a pilha. Neste caso, estamos apenas empurrando a referência implícita a “isto”, então não é a instrução mais emocionante. A segunda instrução é a coisa principal. Ele realmente invoca o construtor da Super maior parte da classe e no caso acima é objeto.hipoteca. E uma vez que o construtor da Super maioria classe (isto é, objeto neste caso) foi chamado, o resto do Código faz instruções específicas escritas em código.

correspondência com o conceito acima., construtor da Super maioria das classes, temos um conceito semelhante na deserialização. No processo de deserialização, é necessário que todas as classes-mãe de instância devem ser serializáveis; e se qualquer super classe na hirarquia não é serializável, então ele deve ter um construtor padrão. Agora faz sentido. Então, enquanto a deserialização a classe super maioria é pesquisada primeiro até que qualquer classe não serializável seja encontrada. Se todas as super classes são serializáveis então JVM acaba alcançando a classe objeto em si e cria uma instância da classe objeto em primeiro lugar., Se entre procurar as super classes, qualquer classe é encontrada não-serializável, então o seu construtor padrão será usado para alocar uma instância na memória.

Se qualquer super classe de instância a ser des-serializada em não-serializável e também não tem um construtor padrão, então a ‘Notserializable Exception’ é lançada pela JVM.

Also, before continuing with the object reconstruction, the JVM checks to see if the serialVersionUID mentioned in the byte stream matches the serialVersionUID of the class of that object. Se não coincidir, então é lançada a’ InvalidClassException’.,

Leia Mais: SerialVersionUID em java e relacionadas com factos rápidos

Então, até agora nós temos a instância localizado na memória usando um dos superclasse do construtor padrão. Note que depois disso nenhum construtor será chamado para qualquer classe. Depois de executar o construtor de super classe, JVM ler o fluxo de byte e usar os meta-dados da instância para definir informações de tipo e outras meta-informações de instância.,

Após a instância em branco ser criada, a JVM primeiro define os seus campos estáticos e então invoca o método de readObject() padrão internamente, que é responsável por definir os valores de fluxo de byte para instância em branco.

Leia Mais: código de Exemplo para readObject() e writeObject()

Após o readObject() o método é concluído, o processo de desserialização é feito e você está pronto para trabalhar com o novo desserializado instância.

Leave A Comment