Serialização e deserialização em Java - Parte 1
Este artigo mostrou como serializar e deserializar objetos Java junto com as características e detalhes envolvidos nestas tarefas. As opções apresentadas são caracterizadas e analisadas de acordo com suas funcionalidades e desempenho.
Em que situação o tema é útil:
A utilidade deste artigo é voltada para o desenvolvedor que procura alguma maneira de persistir objetos Java. A comparação entre três alternativas existentes auxilia o desenvolvedor a tomar uma decisão sobre qual método de serialização/deserialização adotar nos projetos que necessitem de tal funcionalidade.
Resumo DevMan:
O conteúdo desta segunda parte demonstra como as três alternativas de serialização e deserialização são implementadas na linguagem Java. Os códigos fonte das classes para as abordagens que utilizam o formato binário, o formato XML e o banco de dados MySQL são descritos passo a passo. Também são coletadas métricas de desempenho para uma análise comparativa que inclui o tempo de processamento, as características e as vantagens e desvantagens de se empregar as opções de persistência apresentadas.
Muitos desenvolvedores apresentam dúvidas quando é necessário considerar um local de persistência para objetos utilizados em Java, uma vez que esta persistência é necessária para manter o estado da aplicação, exportar e importar ou enviar e receber objetos através da rede.
Neste contexto, a primeira parte deste artigo focou na descrição e no detalhamento do que é serialização/deserialização e nas situações onde é necessário persistir dados em Java. Esta segunda parte destaca como foram desenvolvidas as classes utilizadas para comparar quantitativamente o tempo de execução necessário para a serialização/deserialização de objetos instanciados a partir de um POJO (Plain Old Java Object) que contém os principais tipos de dados básicos do Java. Por fim, é realizada uma análise com base nos dados obtidos através da execução destas classes.
Serialização e Deserialização binária
A serialização binária é o método mais tradicional para a persistência de objetos na plataforma Java. Esta abordagem utiliza um formato binário que só pode ser lido e gravado quando se utiliza o par de classes ObjectInputStrem e ObjectOutputStream em conjunto com as classes FileInputStream e FileOutputStream para ler e gravar os bytes do objeto em arquivos, respectivamente. A gravação e leitura trabalham com os dados em arquivos do sistema de arquivos do sistema operacional de acordo com o valor do quinto parâmetro passado para o método main() da classe ObjectSerDes.
A gravação de dados é implementada dentro do método saveObject(), que recebe o objeto a ser gravado e o local de armazenamento. Já a leitura é codificada no método loadObject(), que recebe apenas o local de armazenamento do arquivo e retorna um objeto genérico da classe Object. A Listagem 1 apresenta o conteúdo dos métodos saveObject() e loadObject(), que devem ser colocados dentro da classe ObjectSerDes.
Listagem 1. Conteúdo dos métodos saveObject() e loadObject() que fazem a serialização e deserialização binária, respectivamente.
// Serializa um objeto no formato binário em um arquivo
// armazenado no local do segundo parâmetro
private static void saveObject(Serializable object, String filename) throws IOException {
// Criando o arquivo e o objeto da classe ObjectOutputStream
ObjectOutputStream objstream = new ObjectOutputStream(new FileOutputStream(filename));
// O método writeObject() automaticamente transforma o conteúdo do
// objeto em bytes. Se a classe não implementar Serialize, um erro será gerado
objstream.writeObject(object);
// Fechando o arquivo e salvando os dados
objstream.close();
}
// Deserializa o objeto armazenado no caminho passado e retorna este
// objeto sem nenhum tipo de casting
private static Object loadObject(String filename) throws ClassNotFoundException, IOException {
// Abre o arquivo para a leitura
ObjectInputStream objstream = new ObjectInputStream(new FileInputStream(filename));
// Lê os bytes e cria o objeto na memória
Object object = objstream.readObject();
// Fecha o arquivo
objstream.close();
// Retorna o objeto sem casting
return object;
}
O método saveObject() inicialmente cria um objeto da classe FileOutputStream de acordo com o local e arquivo passado no seu primeiro parâmetro. Este objeto é utilizado para a criação do objeto objstream da classe ObjectOutputStream. Em seguida utiliza-se o método writeObject() de objstream para transformar em bytes o conteúdo do objeto que será serializado. Por fim, o método close() fecha o arquivo e finaliza a gravação.
O método loadObject() cria um objeto da classe FileInputStream para ler o arquivo passado no seu primeiro parâmetro. Este objeto é utilizado para a criação do objeto objstream da classe ...
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.