【问题标题】:Sometime when i Deserialize it wont load the ArrayList java有时当我反序列化它不会加载 ArrayList java
【发布时间】:2018-01-31 12:52:55
【问题描述】:

我正在通过序列化来保存我的 ArrayList:

public void Save(){
    try{
    FileOutputStream ficheiro = new FileOutputStream("Gravacao");
    ObjectOutputStream out = new ObjectOutputStream(ficheiro);
    out.writeObject(ClassListas.ListaCliente);
    out.writeObject(ClassListas.ListaFornecedor);
    out.writeObject(ClassListas.ListaPessoa);
    out.writeObject(ClassListas.ListaStocks);
    out.writeObject(ClassListas.ListaVenda);
    out.writeObject(ClassListas.ListaRecurso);

    out.flush();
    out.close();

    ficheiro.close();

    }catch(IOException e){
        e.printStackTrace();
    }
}

我通过以下方式反序列化它:

public class FormPrincipal extends javax.swing.JFrame {


public FormPrincipal() {
    initComponents();

    try{
    FileInputStream fx = new FileInputStream("Gravacao");
    ObjectInputStream in = new ObjectInputStream(fx);
    ClassListas.ListaCliente = (ArrayList<ClassCliente>) in.readObject();
    ClassListas.ListaFornecedor = (ArrayList<ClassFornecedor>) in.readObject();
    ClassListas.ListaPessoa = (ArrayList<ClassPessoa>) in.readObject();
    ClassListas.ListaRecurso = (ArrayList<ClassRecurso>) in.readObject();
    ClassListas.ListaStocks = (ArrayList<ClassStock>) in.readObject();
    ClassListas.ListaVenda = (ArrayList<ClassVenda>) in.readObject();
    }catch(Exception e){
        e.printStackTrace();
    }
}

这就是我声明 ArrayLists 的方式:

import java.util.ArrayList;
import main.ClassPessoa;
import main.ClassCliente;
import main.ClassFornecedor;
import main.ClassStock;
import main.ClassVenda;
import main.ClassRecurso;
import java.io.Serializable;

/**
*
* @author Skray
*/
public class ClassListas implements Serializable {
    //Listas
    public static ArrayList<ClassPessoa> ListaPessoa = new ArrayList<ClassPessoa>();
    public static ArrayList<ClassCliente> ListaCliente = new ArrayList<ClassCliente>();
    public static ArrayList<ClassFornecedor> ListaFornecedor = new ArrayList<ClassFornecedor>();
    public static ArrayList<ClassStock> ListaStocks = new ArrayList<ClassStock>();
    public static ArrayList<ClassVenda> ListaVenda = new ArrayList<ClassVenda>();
    public static ArrayList<ClassRecurso> ListaRecurso = new ArrayList<ClassRecurso>();
}

问题是,有时,当我反序列化它时,它不会加载到 ArrayList,但是当我关闭并再次打开它时,它会反序列化...有人能解释一下为什么吗?

【问题讨论】:

  • 考虑遵循 Java 命名约定。变量和方法应该是驼峰式。这不能解决你的问题,但它对未来很重要。我们还需要可以直接粘贴到 IDE 中并进行编译的代码——这使得故障排除更加容易。提供Minimal, Complete, and Verifiable example

标签: java serialization arraylist


【解决方案1】:

首先,您可以编写 ClassListas 实例,而不是使用以下行分别读取和写入每个 ArrayList

ClassListas.ListaCliente = (ArrayList<ClassCliente>) in.readObject();
ClassListas.ListaFornecedor = (ArrayList<ClassFornecedor>) in.readObject();
ClassListas.ListaPessoa = (ArrayList<ClassPessoa>) in.readObject();
ClassListas.ListaRecurso = (ArrayList<ClassRecurso>) in.readObject();
ClassListas.ListaStocks = (ArrayList<ClassStock>) in.readObject();
ClassListas.ListaVenda = (ArrayList<ClassVenda>) in.readObject();

out.writeObject(ClassListas.ListaCliente);
out.writeObject(ClassListas.ListaFornecedor);
out.writeObject(ClassListas.ListaPessoa);
out.writeObject(ClassListas.ListaStocks);
out.writeObject(ClassListas.ListaVenda);
out.writeObject(ClassListas.ListaRecurso);

然后在组件初始化期间从文件中加载对象,只有您可以将代码移动到单独的方法

public ClassListas readFromFile( String file) {
    ClassListas classListas = null ;
    try{
        FileInputStream fx = new FileInputStream(file);
        ObjectInputStream in = new ObjectInputStream(fx);
        classListas = (ClassListas) in.readObject();
    }catch(Exception e){
        e.printStackTrace();
    } finally {
        if( fx != null )
            fx.close();
    }
    return classListas;
}

public void writeToFile( String file,ClassListas classListas ) {
    try{
        FileOutputStream ficheiro = new FileOutputStream(file);
        ObjectOutputStream out = new ObjectOutputStream(ficheiro);
        out.writeObject(classListas);

        out.flush();
        out.close();
    } catch(IOException e){
        e.printStackTrace();
    } finally {
        if( ficheiro != null )
            ficheiro.close();
    }
}

您可以在表单的加载和保存按钮中调用 readFromFile 和 writeToFile。

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 2013-12-14
    • 2015-03-04
    • 1970-01-01
    • 2013-05-07
    • 2015-12-04
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多