Problema para serializar

3 respostas
guguhrocha

Gente fui serializar um ArrayLista,e deu erro(para carregar o aquivo e fazer um pesquisa).
é um arrylist de de objetos de uma classe que eu mesmo criei,mas essa classe implementa serialização;

vamo lá:

public class cliente implements java.io.Serializable { String nome,rua,bairro,cidade,telefone,cpf,numero;

OBS:[b]Meus JButtons, B1 e B2 ativam respectivamente ,salvar e pesquisar cliente.

FileOutputStream saiarq=new FileOutputStream("//home//gugu//arq_aki2.txt");
    ObjectOutputStream saiobj=new ObjectOutputStream(saiarq);


    FileInputStream cararq=new FileInputStream("//home//gugu//arq_aki2.txt");
    ObjectInputStream carobj=new ObjectInputStream(cararq);

 cliente c;
ArrayList<cliente> listacliente=new ArrayList(20000);
String pesq;
public void actionPerformed(ActionEvent e)
        {

        if (e.getSource()==B1)
          
        {
            
        c=new cliente();
        c.setnome(T1.getText());
        c.setCpf(T2.getText());
        c.setTelefone(T3.getText());
        c.setRua(T5.getText());
        c.setNumero(T6.getText());
        c.setBairro(T7.getText());
        c.setCidade(T8.getText());

        listacliente.add(i,c);
        i++;
        JOptionPane.showMessageDialog( null, "Cliente cadastrado!!!" , "Aki Lanches", JOptionPane.PLAIN_MESSAGE);

                

                try {
                
                saiobj.writeObject(listacliente);

                } catch (IOException ex) {
                JOptionPane.showMessageDialog( null, "Erro ao gravar arquivo!!!" , "Aki Lanches", JOptionPane.PLAIN_MESSAGE);
            }
            try {
                saiobj.close();
            } catch (IOException ex) {
                Logger.getLogger(clienteinter.class.getName()).log(Level.SEVERE, null, ex);
            }
           
            }

        T1.setText("");
        T2.setText("");
        T3.setText("");
        T5.setText("");
        T6.setText("");
        T7.setText("");
        T8.setText("");


        if (e.getSource()==B2){
 int acha=0;
            try {
                listacliente = (ArrayList)carobj.readObject();
            } catch (IOException ex) {
                Logger.getLogger(clienteinter.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(clienteinter.class.getName()).log(Level.SEVERE, null, ex);
            }
 pesq=JOptionPane.showInputDialog("Nome do cliente");

 for(int j=0;j< listacliente.size();j++)
 {

 if(pesq.compareTo(listacliente.get(j).getnome())==0)
 {

     String n=listacliente.get(j).getnome();
     JOptionPane.showMessageDialog( null, "Cliente encontrado! " +n, "Aki Lanches", JOptionPane.PLAIN_MESSAGE);
     acha=1;
   }

 
 }
if(acha==0)
 {

     JOptionPane.showMessageDialog( null, "Cliente Inexistente " , "Aki Lanches", JOptionPane.PLAIN_MESSAGE);

 }

 }
        try {
            carobj.close();
        } catch (IOException ex) {
            Logger.getLogger(clienteinter.class.getName()).log(Level.SEVERE, null, ex);
        }
}


}

obrigado!

3 Respostas

davidbuzatto

Oi,

Vc pode começar arrumando seu código em alguns pontos:

  • Pq criou um ArrayList com 20k posições??? O ArrayList vai ir crescendo a medida que você usa o método add. Vc não precisa ficar falando em qual posição vai ser inserido (usando o “i”). Todo novo elemento é inserido no final da lista,
  • Cuidado com os nomes das coisas. Classes devem iniciar com letras maiúsculas, etc, etc, etc. Dê uma lida nesse documento: http://java.sun.com/docs/codeconv/CodeConventions.pdf
  • Vc precisa mesmo armazenar seus clientes em um ArrayList? Porque não usa um arquivo de acesso randômico? Ou mesmo um banco de dados? Existem opções de SGBDs embarcados.

Qual o erro que dá? O arquivo está sendo gerado? Vc percebe o tamanho dele mudar quando insere clientes?

guguhrocha

Ah sim,
modifiquei essa questão de utilizar um indice,e definir o tamanho do ArrayLista(já que é dinamico).
o arquivo aumento o tamanho a medida que salvo nele.

o erro é quando o B2 é ativado logo no inicio,
para pesquisar os clientes já existentes salvos anteriormente em outra execução do programa.

o erro é esse aqui:<blockquote>run:

29/11/2009 11:44:20 aki_lanches.clienteinter actionPerformed

SEVERE: null

java.io.EOFException

at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)

at aki_lanches.clienteinter.actionPerformed(clienteinter.java:159)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)

at java.awt.Component.processMouseEvent(Component.java:6108)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3276)

at java.awt.Component.processEvent(Component.java:5873)

at java.awt.Container.processEvent(Container.java:2105)

at java.awt.Component.dispatchEventImpl(Component.java:4469)

at java.awt.Container.dispatchEventImpl(Container.java:2163)

at java.awt.Component.dispatchEvent(Component.java:4295)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)

at java.awt.Container.dispatchEventImpl(Container.java:2149)

at java.awt.Window.dispatchEventImpl(Window.java:2478)

at java.awt.Component.dispatchEvent(Component.java:4295)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

</blockquote>
moacirjava
Veja se isso pode te ajudar
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

class Pessoa implements Serializable {
  private String nome;
  public Pessoa(String s){
    nome = s;
  }
  public Pessoa(){}
  public String getNome(){
    return nome;
  }
}

public class Objetos{
  public static void main(String[] args) throws FileNotFoundException, IOException, 

ClassNotFoundException{
    List&lt;Pessoa&gt; lista = new ArrayList&lt;Pessoa&gt;();
    for(int i = 0; i &lt; 10; i++)
      lista.add(new Pessoa(&quot;Pessoa &quot;+i));
    
    FileOutputStream saida = new FileOutputStream(
                             new File(&quot;C:\\SeuArquivo.ser&quot;));
    ObjectOutputStream o = new ObjectOutputStream(saida);
    o.writeObject(lista);

    FileInputStream entrada = new FileInputStream(
                              new File(&quot;C:\\SeuArquivo.ser&quot;));
    ObjectInputStream in = new ObjectInputStream(entrada);
    List&lt;Pessoa&gt; lista2 = new ArrayList&lt;Pessoa&gt;();
    lista2 = (List&lt;Pessoa&gt;) in.readObject();

    String minhaPesquisa = "Pessoa 8";
    for(Pessoa p : lista2){
       System.out.println(p.getNome());
       if(minhaPesquisa.equals(p.getNome()))
          System.out.println("Pessoa encontrada!");
    }
  }
}
Criado 29 de novembro de 2009
Ultima resposta 29 de nov. de 2009
Respostas 3
Participantes 3