Em Java, tudo é um objeto e, em um ambiente distribuído, geralmente é necessário passar um objeto de uma extremidade da rede ou dispositivo para a outra extremidade. Isso requer um protocolo que possa transmitir dados nas duas extremidades. O mecanismo de serialização Java é criado para resolver esse problema.
Depois de converter o estado do objeto em um fluxo de bytes, você pode salvá -lo em um arquivo usando classes de vários fluxos de bytes no pacote java.io, tubar -se em outro thread ou enviar dados de objeto para outro host através de uma conexão de rede. A função de serialização do objeto é muito simples e poderosa e é usada em RMI, Socket, JMS e EJB. O problema de serialização do objeto não é o problema mais central da programação de rede, mas é muito importante e tem muitos significado prático.
A serialização do objeto Java não apenas mantém os dados de um objeto, mas também salva recursivamente os dados de cada objeto referenciado pelo objeto. Toda a hierarquia de objetos pode ser gravada em um fluxo de bytes, salva em um arquivo ou passada em uma conexão de rede. A serialização do objeto pode ser usada para executar "cópia profunda" do objeto, ou seja, copiando o próprio objeto e o próprio objeto referenciado. Serializando um objeto pode resultar em uma sequência de todo o objeto.
Método de uso básico:
A serialização refere -se a persistir uma classe ou tipo de dados básico em um fluxo de dados, incluindo arquivo de arquivo, bytes e fluxo de dados de rede.
A implementação da serialização em Java depende principalmente de duas classes: ObjectOutTream e ObjectInputStream. São subclasses de saída de saída e entrada no sistema Java IO. Como eles são fluxos em Java IO, eles podem operá -los como riachos. Aqui está como eles são usados:
importar java.io.byteArrayInputStream; importar java.io.byteArrayOutputStream; importar java.io.ioException; importar java.io.ObjectInputStream; importar java.io.ObjectOutputStream; importar java.io.serializable; Public Class par implementa serializável {private estático final serialversionuid = -1874850715617681161l; Tipo privado int; nome de string privado; public int getType () {return type; } public void setType (int tipo) {this.type = type; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public par (int tipo, nome da string) {super (); this.type = type; this.name = nome; } public static void main (string [] args) lança ioexception, classNotFoundException {// TODO Método Auto-Gerado Stub // Serialize Par de Objetos BytearRayOutputStream Bos = novo ByteArrayOutputStream (); ObjectOutputStream ooS = new ObjectOutputStream (BOS); Par par = novo par (1, "Charlie"); OOS.WriteObject (par); // Deserialize objeto, obtenha novo objeto newpair bytearrayInputStream bis = new ByteArrayInputStream (bos.tobytearray ()); ObjectInputStream ois = new ObjectInputStream (bis); Pare newpair = (par) ois.readObject (); System.out.println (newpair.gettype ()+":"+newpair.getName ()); }}1. Ambas as classes estão no padrão do decorador. Ao criá-los, eles devem passar em um fluxo baseado em bytes. Esses fluxos são os que realmente armazenam dados serializados abaixo.
2. A classe persistida precisa implementar a interface serializável. Essa interface não tem funções, mas é apenas uma interface de marcação. Se a serialização for realizada em uma máquina e os dados resultantes forem transmitidos a outra máquina para a desertalização, as classes dessas duas máquinas devem ser exatamente as mesmas, caso contrário, a serialização não será bem -sucedida.
3. Lembre -se de não usar o ToString para obter a string no código acima e, em seguida, obtenha o bytearrayInputStream desta string e o desestimize. O BOS é armazenado em bytes. A conversão para a string armazenada em caracteres inevitavelmente causará alterações de dados, e o byte [] desenhado da string não será o byte anterior []. Encontrei esse problema porque quero armazenar os dados serializados no arquivo XML. Veja outro artigo em minha solução específica para este problema:
www.vevb.com/article/88130.htm
O que a máquina virtual Java faz ao serializar e deseralizá -la?
O mecanismo de serialização de Java na descrição dessas duas classes é descrito em detalhes em Javadoc:
Citar
O mecanismo de serialização padrão para um objeto escreve a classe do objeto, a assinatura da classe e os valores de todos os campos não transitórios e não estáticos. As referências a outros objetos (exceto em campos transitórios ou estáticos) fazem com que esses objetos sejam escritos também. Várias referências a um único objeto são codificadas usando um mecanismo de compartilhamento de referência para que os gráficos de objetos possam ser restaurados na mesma forma que quando o original foi gravado.
O mecanismo de serialização padrão grava dados para o fluxo incluem:
1. A classe à qual o objeto pertence
2. Assinatura da classe
3. Todas as propriedades não transitórias e não estáticas
4. As referências a outros objetos também causarão a serialização desses objetos.
5. Se várias referências apontarem para um objeto, o mecanismo de referência de compartilhamento será usado.
Citar
As classes que requerem manuseio especial durante o processo de serialização e desserialização devem implementar métodos especiais com estas assinaturas exatas:
private void readObject (java.io.ObjectInputStream Stream) lança ioException, classNotFoundException; private void writeObject (java.io.ObjectOutputStream) lança a ioexception private void readObjectNodata () lança objectStreamException;