Serialização em Java

A serialização em Java é um mecanismo que converte o estado de um objeto em um fluxo de bytes. A desserialização é seu processo inverso. Por meio da desserialização, a partir de um fluxo de bytes, o objeto Java real é criado na memória. Esse mecanismo persiste no objeto.

O fluxo de bytes criado da serialização não depende de nenhuma plataforma. O objeto serializado em uma plataforma pode ser desserializado em qualquer outra plataforma sem nenhum problema. Assim, todo o processo de serialização e desserialização é independente da JVM.

Se um objeto de classe deve ser serializado, é necessário implementar a interface java.io.Serializable. Serializável em java é uma interface de marcador. Não possui campos ou métodos para implementar. Uma classe é tornada serializável por esse processo, que se parece com um processo de aceitação.

A serialização em Java é implementada pelas duas classes ObjectInputStream e ObjectOutputStream.

Tudo o que é necessário é um invólucro sobre eles, para que ele possa ser salvo em arquivo ou ser enviado por uma rede.

O conceito de serialização em Java

A classe ObjectOutputStream, que é a classe de serialização, conforme mencionado na seção acima, contém vários métodos de gravação para gravar vários tipos de dados, mas um método é o mais popular.

public final void writeObject(Object x) throws IOException

O método acima pode ser usado para serializar um Objeto. Este método também envia para o fluxo de saída. Da mesma forma, a classe ObjectInputStream contém o método para desserialização de objetos

public final Object readObject() throws IOException, ClassNotFoundException

O método de desserialização recupera o objeto de um fluxo e desserializa o mesmo. O valor retornado é novamente um objeto, portanto, tudo o que é necessário é convertê-lo no tipo de dados relevante.

Para que uma classe seja serializada com sucesso, há duas condições que devem ser atendidas -

  • io. A interface serializável deve ser implementada pela classe.
  • Todos os campos da classe devem ser serializáveis. Se mesmo um campo não for serializável, deverá ser marcado como transitório.

Se alguém precisa verificar se uma classe é serializável ou não, a solução simples é verificar se a classe implementa o método java.io.Serializable, se o fizer, será serializável, se não for, não será.

Deve-se notar que, ao serializar um objeto em um arquivo, a prática padrão é atribuir ao arquivo uma extensão .ser.

Método de serialização em Java

Se esses métodos estiverem presentes na classe, eles serão usados ​​para serialização em propósitos Java.

Método Descrição
public final void writeObject (Object obj) lança IOException ()Isso gravará o objeto especificado no ObjectOutputStream.
public void flush () lança IOException ()Isso liberará o fluxo de saída atual.
public void close () lança IOException ()Isso fechará o fluxo de saída atual.

Método de desserialização em Java

Método Descrição
public final O objeto readObject () lança IOException, ClassNotFoundException ()Isso lerá um objeto do fluxo de entrada.
public void close () lança IOException ()Isso fechará o ObjectInputStream.

Exemplos de serialização em Java

Nesta seção, discutimos a serialização em Java com exemplos.

Um exemplo em Java é fornecido aqui para demonstrar como a serialização funciona em Java. Criamos uma classe Employee para estudar alguns recursos e o código para o mesmo é fornecido abaixo. Essa classe de funcionário implementa a interface serializável.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

Quando este programa for executado, será criado um arquivo chamado employee.ser. Este programa não fornece uma saída garantida, é apenas para fins explicativos e o objetivo é entender seu uso e funcionamento.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

O programa DeserializeDemo descrito abaixo desserializa o objeto Employee acima criado no programa Serialize Demo .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

O código acima produzirá o seguinte resultado -

Resultado

Funcionário desserializado…

Nome: Rahul Jain

Endereço: epip, Bangalore

SSN: 0

Número: 131

Alguns pontos importantes relacionados ao programa acima são fornecidos abaixo -

  • O bloco try / catch acima tenta capturar uma ClassNotFoundException. Isso é declarado pelo método readObject ().
  • Uma JVM pode desserializar um objeto, apenas se encontrar o bytecode para a classe.
  • Se a JVM não encontrar uma classe durante a desserialização, lançará ClassNotFoundException.
  • o valor de retorno de readObject () é sempre convertido em uma referência de funcionário.
  • O valor do campo SSN era 114433 inicialmente quando o objeto foi serializado, mas como esse valor não foi enviado ao fluxo de saída. Por causa disso, o objeto de campo desserializado SSN do funcionário é 0.

Conclusão

Acima, introduzimos os conceitos de serialização e fornecemos exemplos. Vamos entender a necessidade de serialização como nossas observações finais.

  • Comunicação: se duas máquinas que executam o mesmo código precisam se comunicar da maneira mais fácil, uma máquina deve criar um objeto contendo informações que transmitiria e serializar esse objeto antes de enviá-lo para a outra máquina. Não é um ótimo método, mas faz o trabalho.
  • Persistência: se o estado de operação for armazenado em um banco de dados, ele primeiro será serializado em uma matriz de bytes e, em seguida, armazenado no banco de dados para recuperação em um momento posterior.
  • Cópia em profundidade: se uma ex-replicação de um objeto precisar ser criada e a gravação de uma classe de clone especializada for muito trabalhosa, apenas serializando o objeto e desserializando-o para outro objeto alcançará o objetivo.
  • Sincronização entre JVM: diferentes JVMs em execução em diferentes máquinas e arquiteturas podem ser sincronizadas.

Artigos recomendados

Este foi um guia para serialização em Java. Aqui discutimos os diferentes métodos de serialização em Java com exemplos. Você também pode consultar o seguinte artigo para saber mais -

  1. Perguntas da entrevista do desenvolvedor Java
  2. Lista Java vs Lista de matrizes
  3. Usos do JavaScript