logo

Serialização e desserialização em Java

  1. Serialização
  2. Interface serializável
  3. Exemplo de serialização
  4. Exemplo de desserialização
  5. Serialização com herança
  6. Interface externalizável
  7. Serialização e membro de dados estáticos

Serialização em Java é um mecanismo de escrevendo o estado de um objeto em um fluxo de bytes . É usado principalmente nas tecnologias Hibernate, RMI, JPA, EJB e JMS.

A operação reversa da serialização é chamada desserialização onde o fluxo de bytes é convertido em um objeto. O processo de serialização e desserialização é independente de plataforma, o que significa que você pode serializar um objeto em uma plataforma e desserializá-lo em uma plataforma diferente.

Para serializar o objeto, chamamos o escreverObjeto() método de ObjectOutputStream classe, e para desserialização chamamos de lerObjeto() método de ObjectInputStream aula.

Devemos ter que implementar o Serializável interface para serializar o objeto.

Vantagens da serialização Java

É usado principalmente para viajar pelo estado do objeto na rede (isso é conhecido como marshalling).

serialização java

Interface java.io.Serializable

Serializável é uma interface de marcador (não possui membro de dados e método). É usado para 'marcar' classes Java para que os objetos dessas classes possam obter uma determinada capacidade. O Clonável e Controlo remoto também são interfaces de marcadores.

O Serializável interface deve ser implementada pela classe cujo objeto precisa ser persistido.

A classe String e todas as classes wrapper implementam o java.io.Serializable interface por padrão.

Vejamos o exemplo dado abaixo:

quantos anos tem Pete Davidson

Aluno.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

No exemplo acima, Estudante classe implementa interface serializável. Agora seus objetos podem ser convertidos em stream. A implementação da classe principal é mostrada no próximo código.

Classe ObjectOutputStream

A classe ObjectOutputStream é usada para gravar tipos de dados primitivos e objetos Java em um OutputStream. Somente objetos que suportam a interface java.io.Serializable podem ser gravados em fluxos.

Construtor

1) public ObjectOutputStream (OutputStream out) lança IOException {}Ele cria um ObjectOutputStream que grava no OutputStream especificado.

Métodos importantes

MétodoDescrição
1) public final void writeObject(Object obj) lança IOException {}Ele grava o objeto especificado no ObjectOutputStream.
2) public void flush() lança IOException {}Ele libera o fluxo de saída atual.
3) public void close() lança IOException {}Fecha o fluxo de saída atual.

Classe ObjectInputStream

Um ObjectInputStream desserializa objetos e dados primitivos escritos usando um ObjectOutputStream.

Construtor

1) public ObjectInputStream(InputStream in) lança IOException {}Ele cria um ObjectInputStream que lê o InputStream especificado.

Métodos importantes

MétodoDescrição
1) objeto final público readObject() lança IOException, ClassNotFoundException{}Ele lê um objeto do fluxo de entrada.
2) public void close() lança IOException {}Fecha ObjectInputStream.

Exemplo de serialização Java

Neste exemplo, vamos serializar o objeto de Estudante classe do código acima. O método writeObject() da classe ObjectOutputStream fornece a funcionalidade para serializar o objeto. Estamos salvando o estado do objeto no arquivo denominado f.txt.

Persistir.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

Saída:

 success 
baixe este exemplo de serialização

Exemplo de desserialização Java

A desserialização é o processo de reconstrução do objeto a partir do estado serializado. É a operação inversa da serialização. Vamos ver um exemplo onde estamos lendo os dados de um objeto desserializado.

A desserialização é o processo de reconstrução do objeto a partir do estado serializado. É a operação inversa da serialização. Vamos ver um exemplo onde estamos lendo os dados de um objeto desserializado.

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Saída:

modelos de aprendizado de máquina
211 ravi 
baixe este exemplo de desserialização

Serialização Java com Herança (Relacionamento IS-A)

Se uma classe implementa Interface serializável então todas as suas subclasses também serão serializáveis. Vejamos o exemplo dado abaixo:

SerializeISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Saída:

 success 211 ravi Engineering 50000 

A classe SerializeISA serializou o objeto da classe Student que estende a classe Person que é serializável. As propriedades da classe pai são herdadas pelas subclasses, portanto, se a classe pai for serializável, a subclasse também o será.

Serialização Java com agregação (relacionamento HAS-A)

Se uma classe tiver uma referência a outra classe, todas as referências deverão ser serializáveis, caso contrário o processo de serialização não será executado. Nesse caso, NotSerializableException é lançado em tempo de execução.

Endereço.java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Aluno.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Como Address não é serializável, você não pode serializar a instância da classe Student.

Nota: Todos os objetos dentro de um objeto devem ser serializáveis.

Serialização Java com o membro de dados estáticos

Se houver algum membro de dados estáticos em uma classe, ele não será serializado porque estático é a parte da classe e não do objeto.

Funcionário.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Serialização Java com array ou coleção

Regra: No caso de array ou coleção, todos os objetos do array ou coleção devem ser serializáveis. Se algum objeto não for serializável, a serialização falhará.

mapa datilografado

Externalizável em java

A interface externalizável fornece a facilidade de gravar o estado de um objeto em um fluxo de bytes em formato compactado. Não é uma interface de marcador.

A interface externalizável fornece dois métodos:

    public void writeExternal (ObjectOutput out) lança IOException public void readExternal (ObjectInput in) lança IOException

Palavra-chave transitória Java

Se não quiser serializar nenhum membro de dados de uma classe, você pode marcá-lo como transitório.

Funcionário.java

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Agora, o id não será serializado, portanto, ao desserializar o objeto após a serialização, você não obterá o valor do id. Ele retornará o valor padrão sempre. Nesse caso, retornará 0 porque o tipo de dados do id é um número inteiro.

Visite a próxima página para mais detalhes.

SerialVersionUID

O processo de serialização em tempo de execução associa um id a cada classe Serializable que é conhecida como SerialVersionUID. É usado para verificar o remetente e o destinatário do objeto serializado. O remetente e o destinatário devem ser os mesmos. Para verificar isso, SerialVersionUID é usado. O remetente e o destinatário devem ter o mesmo SerialVersionUID, caso contrário, InvalidClassException será lançado quando você desserializar o objeto. Também podemos declarar nosso próprio SerialVersionUID na classe Serializable. Para fazer isso, você precisa criar um campo SerialVersionUID e atribuir um valor a ele. Deve ser do tipo longo com estático e final. Sugere-se declarar explicitamente o campo serialVersionUID na classe e torná-lo privado também. Por exemplo:

 private static final long serialVersionUID=1L; 

Agora, a classe Serializable ficará assim:

Funcionário.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }