Processo de escrever objetos da memória em uma corrente de dados
- De-serialização é o processo contrário de serialização; é a leitura de objetos de uma corrente de dados
- Os dados são serializados em binário
- As classes de
ObjectOutputStreamsão capazes de ler variáveis e métodos privados por que utilizam a Reflection API
- Alguns casos de uso são:
- troca de objetos para evitar falta de memória
- envio de objetos através de uma rede para replicação ou em chamadas de métodos remotos
- Não é um processo recomendado para armazenamento de memória longínquo; pois, o objeto serializado é funcional apenas para a versão do código compilado que o serializou
- se a classe for alterada o objeto serializado não é mais utilizável
- A palavra reservada
transientindica um campo que deve apenas existir em memória; não deve ser serializado
- Apenas classes que implementem a interface de permissão
Serializablepodem ser serializadas - se um campo do objeto possuí uma instância de classe que não implemente
Serilizable, umaSerializationExceptionserá lançada
- Não é seguro serializar informações sensíveis sem uma encriptação; para garantir essa segurança deve-se utilizar a classe
MessageDigestque permite a encriptação em diversos tipos
Customização do Processo de Serialização
- O método
writeObjectpode ser sobrescrito para executar diferentes ações ao serializar um objeto; deve ser privado
- O método
readObjectpode ser sobrescrito para executar diferentes ações ao de-serializar um objeto; deve ser privado
- Para garantir que o processo de serialização e de-serialização também executem o processo esperado, pode-se chamar os métodos
defaultWriteObjectedefaultReadObjectdentro dos respectivos métodos que alteraram seus comportamentoswriteObjectereadObject
Design de Classes Serializáveis
Ao criar uma classe passível de serialização, deve-se considerar o ciclo de vida dessa classe
- A definição de uma classe é modificada quando o código-fonte é alterado ou a classe é recompilada com uma versão diferente de JDK
- Se um objeto for de-serializado para uma versão diferente da qual ele foi serializado, o programa pode causar erros imprevisíveis. Para evitar isso é possível adicionar uma variável estática e imutável do tipo
longnomeadaserialVersionUID, indicando a versão atual da classe - a classe
ObjectInputStreamverifica essa variável para garantir que a versão serializada seja a mesma que a atual e lança umInvalidClassExceptioncaso sejam diferentes