Serialização

Aula
Estado
💡
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, uma SerializationException 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 e defaultReadObject dentro dos respectivos métodos que alteraram seus comportamentos writeObject e readObject

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 nomeada serialVersionUID, 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 um InvalidClassException caso sejam diferentes