- Serialização
- Interface serializável
- Exemplo de serialização
- Exemplo de desserialização
- Serialização com herança
- Interface externalizável
- 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).
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étodo | Descriçã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étodo | Descriçã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:
successbaixe 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 ravibaixe 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:
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; } }