Introduction

Serialization is the conversion of the state of an object into a byte stream; deserialization does the opposite. Dito de forma diferente, serialização é a conversão de um objeto Java em um fluxo estático (sequência) de bytes que pode então ser salvo para um banco de dados ou transferido através de uma rede.

serialização e Deserialização

o processo de serialização é independente de instância, ou seja,, objetos podem ser serializados em uma plataforma e deserializados em outra. Classes que são elegíveis para serialização precisam implementar uma interface de marcador especial serializável.

tanto o ObjectInputStream como o ObjectOutputStream são classes de alto nível que estendem o java.io.InputStream e o java.io.OutputStream respectivamente. ObjectOutputStream pode escrever tipos primitivos e grafos de objetos para um OutputStream como um fluxo de bytes. Estes fluxos podem ser posteriormente lidos usando ObjectInputStream.,

O método mais importante em ObjectOutputStream é:

public final void writeObject(Object o) throws IOException;

que leva um objeto serializável e o converte em uma sequência (fluxo) de bytes. Similarly, the most important method in ObjectInputStream is:

public final Object readObject() throws IOException, ClassNotFoundException;

Which can read a stream of bytes and convert it back into a Java object. Isto pode então ser lançado de volta para o objeto original.vamos ilustrar a serialização com uma classe de pessoas. Note que os campos estáticos pertencem a uma classe (em oposição a um objeto) e não são serializados., Também, note que podemos usar a palavra-chave transitória para ignorar campos de classe durante a serialização:

public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}

O teste abaixo mostra um exemplo de como salvar um objeto do tipo Pessoa para um local de arquivo, em seguida, leia este valor de volta:

Nós utilizado ObjectOutputStream para salvar o estado do objeto para um arquivo usando o FileOutputStream. O ficheiro ” yourfile.txt ” é criado no diretório do projeto. Este ficheiro é então carregado com o FileInputStream. ObjectInputStream pega esse fluxo e o converte em um novo objeto chamado p2.,

finalmente, testamos o estado do objeto carregado, e ele corresponde ao estado do objeto original.

Notice that the loaded object has to be explicitly cast to a Person type.

Caveats de serialização Java

Existem algumas reservas que dizem respeito à serialização em Java.

3.1. Inheritance and Composition

When a class implements the java.io.Serializable interface, all its sub-classes are serializable as well., Pelo contrário, quando um objeto possui uma referência para outro objeto, esses objetos devem implementar a interface Serializable separadamente, ou então um NotSerializableException será jogado:

public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}

Se um dos campos em um objeto serializável consiste de uma matriz de objetos e, em seguida, todos esses objetos devem ser serializáveis bem, ou então um NotSerializableException será lançada.

3, 2. A versão Serial UID

a JVM associa um número de versão (longo) com cada classe serializável., Ele é usado para verificar que os objetos gravados e carregados têm os mesmos atributos e, portanto, são compatíveis na serialização.

Este número pode ser gerado automaticamente pela maioria dos IDEs e é baseado no nome da classe, seus atributos e modificadores de acesso associados. Qualquer alteração resulta em um número diferente e pode causar uma Invalidclassexcepção.

Se uma classe serializável não declarar um serialVersionUID, o JVM irá gerar um automaticamente no tempo de execução., No entanto, é altamente recomendável que cada classe declare seu serialVersionUID como o gerado é dependente do compilador e, portanto, pode resultar em inesperadas excepções de Invalidclassicções.

3, 3. A serialização personalizada em Java

Java especifica uma forma padrão na qual os objetos podem ser serializados. As classes Java podem sobrepor este comportamento padrão. Serialização personalizada pode ser particularmente útil ao tentar serializar um objeto que tem alguns atributos irresistíveis., Isso pode ser feito oferecendo dois métodos dentro da classe que queremos serializar:

private void writeObject(ObjectOutputStream out) throws IOException;

e

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

Com esses métodos, podemos serializar os unserializable atributos em outras formas que podem ser serializados:

public class Address { private int houseNumber; // setters and getters}

O seguinte teste de unidade testes personalizados de serialização:

este código, vemos como salvar alguns unserializable atributos, serialização de Endereço com serialização personalizada. Note que devemos marcar os atributos irerializáveis como transitórios para evitar a percepção Notserializável.,

Conclusion

neste tutorial rápido, revisamos a serialização Java, discutimos coisas importantes a ter em mente e mostramos como fazer a serialização personalizada.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *