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
ObjectOutputStream
sã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
transient
indica um campo que deve apenas existir em memória; não deve ser serializado
- Apenas classes que implementem a interface de permissão
Serializable
podem ser serializadas - se um campo do objeto possuí uma instância de classe que não implemente
Serilizable
, umaSerializationException
será lançada
- Não é seguro serializar informações sensíveis sem uma encriptação; para garantir essa segurança deve-se utilizar a classe
MessageDigest
que permite a encriptação em diversos tipos
Customização do Processo de Serialização
- O método
writeObject
pode ser sobrescrito para executar diferentes ações ao serializar um objeto; deve ser privado
- O método
readObject
pode 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
defaultWriteObject
edefaultReadObject
dentro dos respectivos métodos que alteraram seus comportamentoswriteObject
ereadObject
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
long
nomeadaserialVersionUID
, indicando a versão atual da classe - a classe
ObjectInputStream
verifica essa variável para garantir que a versão serializada seja a mesma que a atual e lança umInvalidClassException
caso sejam diferentes