Qual é o conceito de serialização em Java?



Este artigo ajudará com uma abordagem abrangente para o conceito de serialização em Java, juntamente com exemplos em tempo real para melhor compreensão.

Serialização em é um conceito importante que trata da conversão de objetos em um fluxo de bytes para transportar os objetos java de uma Java Virtual Machine para outra e recriá-los na forma original. Vou alinhar a súmula para este artigo conforme abaixo:

O que é serialização em Java?

Serialização em Java é o processo de conversão do código Java Objeto dentro de Byte Stream , para transferir o código do objeto de uma máquina virtual Java para outra e recriá-lo usando o processo de Desserialização.





certificado de pós-graduação vs mestrado

Serialization-in-Java-Edureka-Picture-1

Por que precisamos de serialização em Java ?

Precisamos da serialização pelos seguintes motivos:



  • Comunicação : A serialização envolve o procedimento do objeto serialização e transmissão. Isso permite que vários sistemas de computador projetem, compartilhem e executem objetos simultaneamente.

  • Cache : O tempo consumido na construção de um objeto é mais comparado ao tempo necessário para desserializá-lo. A serialização minimiza o consumo de tempo em caching os objetos gigantes.

  • Deep Copy : Clonagem o processo é simplificado com o uso da serialização. Um exato réplica de um objeto é obtido porserializar o objeto para um matriz de bytes e, em seguida, desserializá-lo.



  • Cruz Sincronização JVM: A principal vantagem da serialização é quefunciona em diferentes JVMs que podem estar sendo executados em diferentes arquiteturas ou Sistemas operacionais

  • Persistência: O estado de qualquer objeto pode ser armazenado diretamente pela aplicação de serialização nele e armazenado em um base de dados para que possa ser recuperado mais tarde.

Como serializamos um objeto?

PARA Objeto Java é serializável se e somente se sua classe ou qualquer uma de suas classes pai implementa o Java . Eu . Serializável interface ou sua subinterface, java.io.Externalizable.

No processo de serialização, convertemos o estado de um objeto em um fluxo de bytes para que ele possa ser transferido de uma JVM para a outra e reverter o fluxo de bytes de volta para o objeto original.

//Interface

pacote Serial1 import java.io.Serializable public class Employee implementa Serializable {private static final long serialVersionUID = 1L // Versão serial UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

// Serialize

package Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = new Employee (20120, 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('A serialização e a desserialização foram executadas com sucesso')} catch (Exceção e) {System.out.println (e)}}}

Resultado:

A serialização e desserialização foram executadas com sucesso

Desserialização : É o processo reverso de serialização onde o fluxo de bytes serializado de um objeto do remetente é recriado na extremidade de recebimento.

// Deserializar

pacote Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Funcionário e1 = (Funcionário) in.readObject ( ) Funcionário e2 = (Funcionário) in.readObject () Funcionário e3 = (Funcionário) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Exceção e) {System.out.println (e)}}}

Resultado:

20110 John
22110 Jerry

20120 Sam

Vantagens e desvantagens da serialização em Java

Vantagens:

  • O processo de serialização é um construídas em recurso que não requer software de terceiros para executar a serialização
  • O procedimento de serialização provou ser simples e fácil para entender

  • O procedimento de serialização é universal e desenvolvedores de origens diferentes estão familiarizados com isso

  • É fácil de usar e simples de personalizar

  • Streams de dados serializados suporta criptografia, compressão, autenticação e computação Java segura

  • Há muitos tecnologias críticas contando com a serialização.

Desvantagens:

  • Objetos enquanto a DeSerialização se torna frágil e eles não têm certeza de que serão deserializados de forma eficaz.

  • As variáveis ​​transientes declaradas enquanto a serialização cria espaço de memória, mas o construtor não é chamado, o que resulta na falha na inicialização das variáveis ​​transientes, resultando em um variação do fluxo de Java padrão.

  • O processo de serialização é ineficiente em termos de utilização de memória.

  • A serialização não é preferível para ser usada nas aplicações que precisam acesso simultâneo sem a exigência de APIs de terceiros , como a serialização não oferece nenhum mecanismo de controle de transição por cada SE.

  • O procedimento de serialização não oferece controle refinado para acessar objetos.

Exemplos práticos de serialização em Java

Serialização usando herança

Caso - 1: Se a Superclasse for serializável, então, por padrão, suas subclasses também são serializáveis.

Neste caso, o subclasse é serializável por padrão se o superclasse está implementando o Interface serializável

pacote SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable classe A implementa Serializable {int i public A (int i) {this.i = i}} classe B estende A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) lança Exceção {B b1 = new B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('O objeto foi serializado') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('O objeto foi desserializado') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Resultado:

j = 20
O objeto foi serializado
O objeto foi desserializado
i = 200
j = 400

Caso - 2: Uma Subclasse pode ser serializada se implementar a Interface Serializável, mesmo se uma Superclasse não implementar a Interface Serializável.

Neste caso, se o superclasse não está implementando o Interface serializável , então, os objetos do subclasse pode ser serializado manualmente implementando a interface serializável na subclasse.

pacote SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i) {this.i = i} superclasse pública () {i = 50 System.out.println ('Construtor da superclasse chamado')}} classe subclasse estende superclasse implementa Serializable {int j subclasse pública (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) lança Exceção {subclasse b1 = nova subclasse (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('O objeto foi serializado') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclasse b2 = (subclasse) ois.readObject ( ) ois.close () fis.close () System.out.println ('O objeto foi desserializado') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

O objeto foi serializado
Construtor de superclasse chamado
O objeto foi desserializado
i = 50
j = 20

Caso - 3: se a superclasse é serializável, mas não precisamos que a subclasse seja serializada.

Neste caso, a serialização da subclasse pode ser evitadaimplementando o writeObject () e readObject () métodos na subclasse e precisa lançar NotSerializableException a partir desses métodos.

pacote SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class Parent implementa Serializable {int i public Parent (int i) {this.i = i}} class child extends Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) throws IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) throws IOException {throw new NotSerializableException ()}} public class test3 {public static void main (String [] args) lança Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Object foi serializado ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('O objeto foi desserializado') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Resultado:

i = 100
j = 200
Exceção no thread 'main' java.io.NotSerializableException
em SerializationInheritance.child.writeObject (test3.java:48)
em sun.reflect.NativeMethodAccessorImpl.invoke0 (método nativo)

Serialização usando um membro estático

A serialização do campo de membro estático é ignorada no processo de serialização. Serialização érelacionado ao estado mais recente do objeto. Portanto, apenas os dados associados a uma instância específica de uma classe sãoserializado, mas não o campo de membro estático.

pacote stati import java.io. * class StaticSerial implementa Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('No momento da serialização, membro estático tem valor: '+ i) try {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = new FileInputStream ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Após a desserialização, o membro estático tem valor:' + i)} catch (Exceção e) {System.out.println (e)}}}

Resultado:

No momento da serialização, o membro estático tem valor: 100
Após a desserialização, o membro estático tem o valor: 99

Interface externalizável

o Interface externalizável em Java é semelhante à serialização, mas a única diferença é que é capaz de oferecer serialização customizada onde você decide os objetos a serem ensaiados no riacho.

A interface externalizável está disponível no java.io e fornece dois métodos:

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

As principais diferenças entre serialização e externalizável são as seguintes:

  • Implementação : Interface externalizável permite que o usuário explicitamente mencione os objetos a serem serializados. Enquanto na Interface de Serialização, todos os objetos e variáveis ​​são serializados no tempo de execução.

  • Métodos : A interface externalizável consiste em dois métodos, a saber:

    • writeExternal ()

    • readExternal ()

Visto que a Interface serializável não inclui nenhum método.

  • Processo: O processo de serialização na interface externalizável fornece costumização para o processo de serialização. Mas, a interface de serialização fornecerá o padrão processo de serialização.

  • Compatibilidade e controle com versões anteriores: Interface externalizável oferece suporte a serialização, independentemente do controle de versão e o único problema é que o usuário deve ser responsável ao serializar a Super Class. Por outro lado, a interface de serialização requer o mesma versão de JVMs em ambas as extremidades, mas incorpora serialização automática de todos os objetos e classes, incluindo a superclasse.

  • Construtor público No-Arg: Necessidades de interface de externalização Construtor público No-Arg para reconstruir o objeto serializado. Embora a interface de serialização não exija o construtor No-Arg, ela usa reflexão para reconstruir o objeto serializado ou classe.

pacote ext import java.io. * class Demo implementa java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1, 'Bem-vindo à Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (object) out.close () file.close () System.out.println ('Object has been serialized')} catch (IOException ex) {System.out.println ('IOException is taken')} Demo object1 = null try {FileInputStream file = new FileInputStream (filename) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('O objeto foi desserializado ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException foi capturado ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException é capturada')}}}

Palavra-chave transitória

Palavra-chave transitória é um palavra-chave reservada em Java. É usado como um variável modificar no momento do processo de serialização. Declarar uma variável com a palavra-chave Transient evita que a variável seja serializada.

UID da versão serial

Antes de o processo de serialização começar, cada classe / objeto serializável é associado a um número de identificação único fornecido pela JVM da máquina host. Este ID único é chamado UID da versão serial . Este UID é usado como uma identificação pela JVM da extremidade receptora para confirmar que o mesmo objeto está sendo DeSerializado na extremidade receptora.

Controvérsias da serialização em Java

Da Oracle Os arquitetos pretendem remover a serialização de Java, pois consideram isso como um Erro horrível de 1997 . Após uma pesquisa agitada, os desenvolvedores da Oracle descobriram algumas falhas no design do procedimento de serialização que representam uma ameaça aos dados.

No ano de 1997,Mark Reinhold afirma - “ Gostamos de chamar a serialização de 'o presente que continua dando', e o tipo de presente que continua dando são vulnerabilidades de segurança. Provavelmente um terço de todas as vulnerabilidades do Java envolveram serialização - pode ser mais da metade. É uma fonte surpreendentemente fecunda de vulnerabilidades, para não falar de instabilidades ”.

python def __init__

Há chances de que a serialização seja removida ou substituída nas próximas atualizações do Java e, por outro lado, para um iniciante em Java, a serialização não conseguia seja uma opção idealista em seus projetos

Melhores práticas ao usar serialização em Java

A seguir estão algumas práticas recomendadas que precisam ser seguidas

  • É recomendado o uso javadoc @ tag serial para denotar campos serializáveis.
  • o .ser estar extensão é preferível para ser usada para arquivos que representam objetos serializados.
  • Não é recomendado que nenhum campo estático ou transitório sofra serialização padrão.
  • Aulas extensíveis não deve ser serializado a menos que seja obrigatório.
  • Classes internas deve ser evitado o envolvimento na serialização.

Com isso, chegamos ao final deste artigo. Espero que você tenha entendido os fundamentos da serialização em Java, seus tipos e funcionalidades.

Confira o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso de certificação e treinamento Java J2EE e SOA da Edureka é projetado para estudantes e profissionais que desejam ser um desenvolvedor Java. O curso foi desenvolvido para dar a você uma vantagem na programação Java e treiná-lo para os conceitos básicos e avançados de Java, juntamente com vários frameworks Java como Hibernate Primavera .

Tem alguma questão para nós? Mencione isso na seção de comentários deste artigo “Serialização em Java” e entraremos em contato com você o mais breve possível.