Análise do algoritmo de serialização Java
A serialização é um processo de descrição de um objeto como uma série de bytes. A desserialização é um processo de reconstrução desses bytes em um objeto; A API Java Serialization fornece um mecanismo padrão para lidar com a serialização de objetos. Aqui você pode aprender como serializar um objeto, quando a serialização é necessária, e o algoritmo de serialização Java. Usamos um exemplo para demonstrar como os bytes após a serialização descrevem as informações de um objeto.
A necessidade de serialização
Em Java, tudo é um objeto. Em um ambiente distribuído, muitas vezes é necessário transferir objetos de uma rede ou dispositivo para outro. Isso requer um protocolo que possa transmitir dados em ambas as extremidades. O mecanismo de serialização Java foi criado para resolver este problema.
Como serializar um objeto
O pré-requisito para que um objeto seja serializável é implementar a interface Serializable. A interface Serializable não possui métodos e é mais parecida com um marcador. Classes com esta tag podem ser processadas pelo mecanismo de serialização.
100.
O formato de serialização do objeto
Qual é a aparência de um objeto depois de ser serializado? Abra o arquivo temp.out que acabamos de serializar e gerar o objeto e exibi-lo em hexadecimal. O conteúdo deverá ser o seguinte:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
versão de byte público = 100;
contagem de bytes públicos = 0;
Ambos são do tipo byte Em teoria, são necessários apenas 2 bytes para armazenar esses dois campos, mas na verdade temp.out ocupa 51 bytes, o que significa que além dos dados, inclui também outras descrições do objeto serializado.
Algoritmo de serialização Java
O algoritmo de serialização geralmente executa as seguintes etapas:
◆Metadados de classe de saída relacionados a instâncias de objetos.
◆ Produza recursivamente a descrição da superclasse da classe até que não haja mais superclasses.
◆ Após a conclusão dos metadados da classe, os valores reais dos dados da instância do objeto são gerados a partir da superclasse de nível superior.
◆ Gerar dados de instância recursivamente de cima para baixo
Vamos ilustrar com outro exemplo que cobre de forma mais completa todas as situações possíveis:
classe contém implementos Serializable{
int contémVersão = 11;
}
classe pública SerialTest estende pai implementa Serializable {
versão interna = 66;
contém con = new contém();
public int getVersão() {
versão de retorno;
}
public static void main(String args[]) lança IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}
O formato serializado é o seguinte:
CA ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A CA 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
Vamos dar uma olhada mais de perto no que esses bytes representam. Começando, veja cor:
A primeira etapa no algoritmo de serialização é gerar uma descrição da classe relacionada do objeto. O objeto mostrado no exemplo é uma instância da classe SerialTest, portanto a descrição da classe SerialTest é exibida a seguir. Veja cores:
A seguir, o algoritmo gera um dos campos, inversão=66, veja cor:
Então, o algoritmo gera o próximo domínio, contém con = new contém (); isso é um pouco especial, é um objeto. Ao descrever referências de tipo de objeto, você precisa usar a notação de assinatura de objeto padrão da JVM, consulte a cor:
.Em seguida, o algoritmo produzirá a descrição da superclasse, que é a classe Pai. Veja a cor:
Em seguida, produza a descrição do domínio da classe pai, intparentVersion=100, veja também color:
Até agora, o algoritmo produziu as descrições de todas as classes. A próxima etapa é gerar o valor real do objeto de instância. Neste momento, ele parte do domínio da classe pai, veja a cor:
Existem também campos da classe SerialTest:
Os bytes a seguir são mais interessantes. O algoritmo precisa descrever as informações da classe contém. Lembre-se, a classe contém ainda não foi descrita.
.Produza a descrição exclusiva do domínio de contains, intcontainVersion=11;
Neste momento, o algoritmo de serialização verificará se contém possui uma superclasse e, em caso afirmativo, irá produzi-la.
Finalmente, o valor real do domínio da classe contém é gerado.
OK, discutimos o mecanismo e os princípios da serialização Java e esperamos que seja útil para os alunos.