Interface serializável em Java com exemplos

Publicados: 2021-11-29

Java oferece vários pacotes, dos quais a interface Serializable é um deles. Ele está presente no pacote Java java.io e é um tipo de interface de marcador. Quando definido como uma interface de marcador, não há métodos ou campos presentes na interface. Portanto, sempre que qualquer classe implementa a interface, a interface não precisa implementar nenhum método. As classes implementam a interface se uma classe quiser que suas instâncias sejam serializadas ou desserializadas.

O mecanismo de serialização é usado para a conversão de um estado de objeto em um fluxo de bytes. Esse mecanismo é executado usando o ObjectOutputStream. O processo de desserialização é exatamente o oposto do processo de serialização. Nesse caso, o fluxo de bytes é convertido novamente no objeto Java. ObjectInputStream é usado para desserialização.

Índice

Serialização

A conversão do estado de qualquer objeto em um fluxo de bytes é conhecida como serialização. E o oposto da serialização é a desserialização. Um objeto de Java pode ser convertido em um fluxo de bytes estáticos. Esse fluxo estático pode ser salvo em um banco de dados ou também pode ser transferido para uma rede diferente. O processo de serialização é dependente da instância. Isso significa que a serialização de objetos pode ser realizada em uma plataforma e, em seguida, a desserialização dos objetos pode ser realizada em outra plataforma. Um tipo específico de interface de marcador, “Serializável”, é implementado para o processo de serialização. Assim, as classes elegíveis para serialização, ou seja, a classe serializável em Java , devem implementar a interface do marcador.

Esse mecanismo de gravação de um estado de objeto em um fluxo de bytes é conhecido como serialização. O mecanismo é usado principalmente nas tecnologias JMS, EJB, JPA, RMI e Hibernate.

ObjectInputStream e ObjectOutputStream são as formas de classes de alto nível que estendem o java.io.InputStream e o java.io.OutputStream. Os tipos primitivos e os gráficos de objetos podem ser gravados no OutputStream pelo ObjectOutputStream em um byte

Stream. O fluxo resultante da conversão pode ser lido por meio do ObjectInputStream. Assim, para a serialização, o método writeObject() é chamado a partir do ObjectOutputStream e para a desserialização, o método readObject() é chamado a partir da classe ObjectInputStream.

O método que é o mais importante em ObjectOutputStream é:

A linha de código acima foi retirada de https://www.baeldung.com/java-serialization.

Na linha de código acima, um objeto que é serializável é obtido e, em seguida, convertido em um fluxo ou fluxo de bytes.

No caso de ObjectInputStream, o método mais crítico é:

A linha de código acima foi retirada de https://www.baeldung.com/java-serialization.

A linha de código acima pode ler a sequência de bytes e converter esse fluxo de bytes em um objeto Java. O objeto original pode ser lançado de volta através disso.

Uma ilustração do processo de serialização pode ser descrita abaixo:

Uma classe “Person” é considerada para serialização. Os campos estáticos não são serializados e pertencem a algumas classes. Os campos de classe podem ser ignorados usando a palavra-chave “transient” no processo de serialização.

Fonte

O objeto do tipo pessoa pode ser salvo em algum arquivo local e, em seguida, o valor é lido novamente. O código mostrado abaixo pode ser usado para essa finalidade.

ObjectOutputStream foi usado para salvar o estado do objeto em um arquivo usando o FileOutputStream. Neste exemplo, um arquivo chamado “seuarquivo.txt” foi criado no diretório do projeto. Através do uso de FileInputStream, o arquivo criado é carregado. Esse fluxo é então selecionado pelo ObjectInputStream e é convertido em um novo objeto com o nome p2. O estado do objeto carregado é finalmente testado e é combinado com o estado do objeto original. O objeto que é carregado deve ser lançado explicitamente para a pessoa típica.

Advertências na serialização Java

1. Herança e Composição

Sempre que um usuário implementa a interface java.io.Serializable, todas as subclasses de classe que implementam a interface se tornam serializáveis. Além disso, se um objeto contém uma referência a um objeto diferente, os objetos referidos para implementar a interface são serializáveis ​​separadamente; se esses objetos não implementarem a interface, uma exceção será lançada. A exceção lançada será NotSerializableException. Além disso, se suponha que uma matriz de objetos seja armazenada em um objeto serializável, todos os objetos de matriz devem ser serializados. Se nenhuma serialização dos objetos acontecer, ele lançará a exceção “NotSerializableException”.

2. UID da versão serial

Para cada classe que implementa a interface Serializable, um número é associado a cada uma das classes. O número está associado à Java Virtual Machine. Isso é feito principalmente para verificar se os objetos carregados e salvos possuem os atributos exatos. Somente se os atributos forem os mesmos, os objetos serão compatíveis na serialização. Os IDEs geram esses números automaticamente e são baseados principalmente nos nomes da classe, seus atributos e os modificadores de acesso associados a ela. Uma exceção, “InvalidClassException,” será lançada se um número diferente resultar das alterações.

Se um serialVersionUID não for declarado por uma classe serializável, a JVM o gerará automaticamente durante o tempo de execução. Embora haja geração automática do número, ainda é recomendável que as classes declarem um serialVersionUID. Isso ocorre porque o serialVersionUID, que será gerado automaticamente, será dependente do compilador e, às vezes, poderá gerar InvalidClassExceptions inesperadas.

3. Serialização personalizada

Uma maneira padrão foi definida em Java para serializar os objetos. Java pode substituir esse comportamento padrão. Existe uma maneira de serialização personalizada. É particularmente útil nos casos em que o objeto com atributos não serializáveis ​​está tentando ser serializado. A serialização de tais objetos pode ser feita através de dois métodos dentro de uma classe que o usuário deseja que seja serializada. Esses dois métodos são:

Os dois métodos acima podem ser usados ​​para serializar os atributos em qualquer formulário que possa ser serializado, que anteriormente não era serializável.

Vantagens da serialização em Java

Uma das vantagens da serialização em Java é que o estado de um objeto pode ser percorrido em uma rede.

A interface Java java.io.Serializable

java.io.Serializable é uma interface de marcador, o que significa que não há métodos e objetos dentro da interface. A função primária da interface do marcador é marcar o

classes de Java para dar uma capacidade particular a todos os objetos das classes. Exemplos de interfaces de marcador são Remoto e Cloneable.

A interface deve ser implementada por qualquer classe que use a interface para serializar seus objetos. Por padrão, as classes como classes wrapper e a classe String implementam a interface java.io.Serializable.

Um exemplo serializável java é mostrado abaixo.

No código acima, pode-se observar que a classe Student implementa a interface Serializable. Portanto, uma vez que a classe implementa a interface Serializable, os objetos dentro da classe podem ser convertidos em bytes de fluxo.

  • Classe ObjectOutputStream

Essa classe é usada para gravar os tipos primitivos de dados e os objetos Java no OutputStream. O objeto que suporta a interface java.io.Serializable pode ser usado para gravar em streams.

  • Classe ObjectInputStream

Todos os dados primitivos que foram gravados usando o ObjectOutputStream são desserializados usando o ObjectInputStream.

Um exemplo de uma interface serializável em Java é mostrado abaixo.

Neste exemplo, a classe Student será serializada. O método writeObject() da classe ObjectOutputStream, fornece toda a funcionalidade para serialização dos objetos. O estado do objeto é salvo em um arquivo com o nome f.txt.

Conclusões

O artigo discutiu o conceito de serialização em Java. Ele listou as interfaces e outros métodos importantes necessários para serializar os objetos de uma classe. O processo de serialização está sempre associado a um id ou número a cada classe serializável. Esse número é conhecido como SerialVersionUID. O principal uso do SerialVersionUID é verificar o remetente e o destinatário do objeto que deve ser serializado. Isso ocorre porque o remetente e o destinatário devem ser os mesmos.

É uma característica importante da linguagem de programação Java. Se você quiser saber mais sobre recursos e conceitos tão importantes em Java e dominar suas habilidades de linguagem de programação, você pode conferir os Cursos de Engenharia de Software oferecidos pelo upGrad. Se você é um profissional que trabalha, o curso é mais adequado para você. Para qualquer tipo de dúvida, nossa equipe de assistência pode ser contatada. Você também pode navegar em nosso site para o curso específico e obter informações detalhadas.

O que é interface serializável em Java?

A interface serializável é uma interface de marcador. A interface do marcador fornece uma dica para o Java Runtime de que a classe de implementação permite ser serializada. O runtime aproveitará essa interface para serializar o objeto. Interface serializável em java é uma interface especial a ser implementada por classes de dados em java. Quando uma classe implementa essa interface, ela pode ser persistida em um banco de dados. Esta interface é declarada no pacote java.io. A interface serializável possui dois métodos, readResolve() e writeReplace() , que são usados ​​para ler e escrever objetos no banco de dados.

O que acontece se implementarmos a interface Serializable em Java?

Implementar a interface Serializable em Java significa ter um objeto que pode ser serializado e desserializado em qualquer sistema que tenha interface Serializable. A implementação dessa interface seria efetiva quando a classe estivesse sendo serializada externamente por bibliotecas de terceiros (JSON, XML, etc.) ou por protocolos de rede. Quando uma variável é declarada como Serializable, cada instância da variável será serializada e desserializada se for passada como parâmetro para um método ou quando for retornada de um método. A serialização é realizada de forma programática para que o estado de um objeto possa ser preservado para depois, quando for necessário desserializá-lo e apresentar ao usuário do objeto.

Podemos transferir um objeto serializado via rede?

Um objeto serializado é um objeto que contém um fluxo de bytes. O construtor do objeto ou os métodos writeObject() / readObject() são usados ​​para colocar o fluxo de bytes no objeto. Os dados armazenados podem ser texto, áudio, vídeo ou qualquer dado de aplicativo personalizado. Os dados desses objetos podem ser armazenados em um arquivo ou em um servidor remoto. Para transferir objetos serializados via rede deve-se utilizar o protocolo RMI (Remote Method Invocation). RMI é um bom protocolo para criar aplicativos distribuídos. Ele permite que o cliente se comunique com métodos em objetos em um aplicativo Java executado em um servidor. O protocolo RMI é um mecanismo de chamada de procedimento remoto (RPC).