Desserializar objetos [RESOLVIDO]

6 respostas
D

Olá pessoal!

Comecei a estudar serialização em Java, porém estou com uma dúvida. Como faço para desserializar mais de um objeto por vez?
Um exemplo de como estou fazendo para serializar:

try{ Contato contato = new Contato(); contato.nome = campo.getText(); JFileChooser caminhoSalvar = new JFileChooser(); caminhoSalvar.showSaveDialog(frame); ObjectOutputStream gravar = new ObjectOutputStream(new FileOutputStream(caminhoSalvar.getSelectedFile().getAbsolutePath(), true)) gravar.writeObject(contato); gravar.close(); }catch(IOException ex){ ex.printStackTrace(); }

Coloquei este código no evento do botão gravar.
Para ler os objetos gravados, consigo ler apenas um por vez. Já tentei usar o seguinte código para mostrar em um objeto JTextArea:

try{ JFileChooser caminhoArquivo = new JFileChooser(); caminhoArquivo.showOpenDialog(frame); File arquivo = new File(caminhoArquivo.getSelectedFile().getAbsolutePath()); ObjectInputStream ler = new ObjectInputStream(new FileInputStream(arquivo)); Contato contatos = new Contato(); while (true){ contatos = (Contato) ler.readObject(); exibecontato.append(contatos.nome + "\n"); } ler.close(); } catch(ClassNotFoundException cnf){ cnf.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); }

Porém ao listar é lido apenas o primeiro objeto, ao ler o segundo ocorre a seguinte exceção:

java.io.StreamCorruptedException: invalid type code: AC

Vocês poderiam me dizer a melhor forma de ler todos os objetos serializados?
Obrigado!

6 Respostas

C

Man,

da uma olhada nisso
http://javaaberto.blogspot.com.br/2012/09/serializacao.html

D

charleston10:
Man,

da uma olhada nisso
http://javaaberto.blogspot.com.br/2012/09/serializacao.html


A forma que ensina no artigo lê apenas um objeto por vez. Gostaria de saber como que se lê todos os objetos serializados que estão em um arquivo. Provavelmente é feito atribuindo-os à uma matriz.

F

Testa desta forma:

FileInputStream fin = null;
try{  
    JFileChooser caminhoArquivo = new JFileChooser();  
    caminhoArquivo.showOpenDialog(frame);  
    fin = new FileInputStream(new File(caminhoArquivo.getSelectedFile().getAbsolutePath()));     
    while (true){  
        ObjectInputStream ler = new ObjectInputStream(fin);
        Contato contato = (Contato) ler.readObject();  
        exibecontato.append(contatos.nome + "\n");  
    }  
} catch(ClassNotFoundException cnf){  
    cnf.printStackTrace();  
} catch(IOException ex){  
    ex.printStackTrace();  
} finally {
  if(fin != null)
     fin.close;
}

Referência: http://stackoverflow.com/questions/3182240/java-io-streamcorruptedexception-invalid-type-code-ac

D

Fiz uns ajustes no código e funcionou. Obrigado!
Segue o código que utilizei:

try{ JFileChooser caminhoArquivo = new JFileChooser(); caminhoArquivo.setCurrentDirectory(new File("C:\\Users\\Deivid\\Desktop\\java\\Agenda")); int exists = caminhoArquivo.showOpenDialog(frame); if (exists == JFileChooser.APPROVE_OPTION){ FileInputStream fin = new FileInputStream(new File(caminhoArquivo.getSelectedFile().getAbsolutePath())); while (true){ ObjectInputStream ler = new ObjectInputStream(fin); Contato contatos = (Contato) ler.readObject(); exibecontato.append(contatos.nome + "\n"); if(fin == null){ fin.close(); } } } } catch(ClassNotFoundException cnf){ cnf.printStackTrace(); } catch(EOFException eof){ return; } catch(IOException ex){ ex.printStackTrace(); }

F

Tem um erro no seu código, pq você removeu o bloco finally? Ele estava la exatamente pois você tem que fechar o FileInputStream após o uso dele.
E outra observação, o trecho a seguis do seu código nunca vai ser executado pq o “fin” nunca vai estar nulo. Coloque novamente o bloco finally e remova o trecho abaixo do seu código.

if(fin == null){ fin.close(); }

D

Refiz o código, tratando a exceção que pode ser lançada no bloco finally.

try{ JFileChooser caminhoArquivo = new JFileChooser(); caminhoArquivo.setCurrentDirectory(new File("C:\\Users\\Deivid\\Desktop\\java\\Agenda")); int exists = caminhoArquivo.showOpenDialog(frame); if (exists == JFileChooser.APPROVE_OPTION){ fin = new FileInputStream(new File(caminhoArquivo.getSelectedFile().getAbsolutePath())); while (true){ ObjectInputStream ler = new ObjectInputStream(fin); Contato contatos = (Contato) ler.readObject(); exibecontato.append(contatos.nome + " | " + contatos.fone + " | " + contatos.email + " | " + contatos.endereco + "\n"); } } } catch(ClassNotFoundException cnf){ cnf.printStackTrace(); } catch(EOFException eof){ return; } catch(IOException ex){ ex.printStackTrace(); } finally { try{ if(fin != null){ fin.close(); } } catch(IOException ioe){ ioe.printStackTrace(); } }

Entendi o que você quis dizer. Mais como sei quando o FileInputStream não tiver mais objetos para ler? Através do método read()? E você saberia o problema em não fechar o FileInputStream?

Criado 24 de dezembro de 2012
Ultima resposta 29 de dez. de 2012
Respostas 6
Participantes 3