Problema ao salvar um ArrayList em arquivo

Galera, teoricamente o meu programa consegue salvar em arquivo, porém quando mando carregar esses dados apresenta o seguinte erro: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lmodel.Cliente;

O meu código é esse (vou tirar algumas partes que não tem a ver com isso).

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import model.Cliente;

public class ClienteRepository {

protected  List<Cliente> clientes;

public ClienteRepository(){
    clientes = new ArrayList<>();
}

public void persistAll(){
try{
FileOutputStream arquivoOut = new FileOutputStream(“clientesLista.dat”);
ObjectOutputStream out = new ObjectOutputStream(arquivoOut);
out.writeObject(clientes.toArray());
System.out.println(“Clientes Salvos.”);
}
catch(IOException e){
System.out.println(“Falha ao Salvar.”);
}
}

public void loadAll(){
    try{
        FileInputStream arquivoIn = new FileInputStream("clientesLista.dat");
        ObjectInputStream in = new ObjectInputStream(arquivoIn);
        Cliente[] loader = (Cliente[])in.readObject();
        clientes.addAll(Arrays.asList(loader));
    }
    catch(Exception ex){
        System.out.println("Erro ao gravar.");
        System.out.println(ex);
    }
}

}

Ah, eu ja fiz a implementação da interface Serializable na minha classe Cliente.

No seu método persistAll(), quando você faz out.writeObject(clientes.toArray()) o clientes.toArray() retorna um Object[] e não um Cliente[].

Como você está granavado um Object[], acontece ClassCastException quando você vai tentar ler com Cliente[] loader = (Cliente[]) in.readObject().

Para fazer o toArray retornar um Cliente[], você precisa passar um Cliente[] como parâmetro, assim:

public void persistAll(){
    try{
        FileOutputStream arquivoOut = new FileOutputStream("clientesLista.dat");
        ObjectOutputStream out = new ObjectOutputStream(arquivoOut);
        out.writeObject( clientes.toArray(new Cliente[clientes.size()])) );
        System.out.println("Clientes Salvos.");
    } catch(IOException e){
        System.out.println("Falha ao Salvar.");
    }
}

Cara eu já consegui resolver aqui, mas era exatamente isso que você falou, fiz as alterações e funcionou perfeitamente.
Agradeço pela explicação, tmj

1 curtida