保存单个对象

时间:2011-06-05 20:06:15

标签: java serialization object singleton save

我知道这个网站不是针对这样的问题而做的,但我一直在寻找答案,我没有找到任何东西,我需要确认。

我有一个单例类,这是我的程序的中心,在某些情况下我试图保存其状态,但它似乎没有正确保存,我不明白为什么因为这不是我第一次这样做,但这是我第一次尝试保存单例,那么是否可以保存单例对象? 以下是此对象的加载和保存代码

 public void Loading(String name) {
    ObjectInputStream is = null;
 //ignore this variable
    game_loaded = 1;
    try {
        is = new ObjectInputStream(new FileInputStream(name + ".dat"));
                 //Logica is the singleton class, 
                 //logi is the name of the variable where it is
        logi = (Logica) is.readObject();
    } catch (FileNotFoundException e1) {
        JOptionPane.showOptionDialog(frame, "Game Invalid", "Load",
                JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
                null, new String[] { "Ok" }, "Ok");
        return;

    } catch (IOException e1) {

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        is.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block

    }

    JOptionPane.showOptionDialog(frame, "Game Loaded Sucessfully", "Load",
            JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
            null, new String[] { "Ok" }, "Ok");

}

保存:

    public void saving(String nome){

    ObjectOutputStream os = null;

    try {
        os = new ObjectOutputStream(new FileOutputStream(nome+".dat"));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        return;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        return;
    }
    try {
        os.writeObject(Logica.getLogica(null));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        return;
    }
    JOptionPane.showOptionDialog(frame, "Game Saved sucessfully", "Load",
            JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
            null, new String[] { "Ok" }, "Ok");
    if (os != null)
        try {
            os.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}

修改

好的我可能已经解释过,它没有给我任何错误加载,但它没有加载我保存的状态,它加载一个新的“Logica”,好像我创建了一个新的

2 个答案:

答案 0 :(得分:3)

Singleton本身并没有说它无法序列化;您可以为任何类编写不正确的序列化代码。目前尚不清楚什么是错的,我不愿意仔细研究你的代码来解决它,但应该可以做到。

IOException有一个空的catch块。这总是一个坏主意。你吞下了可能解释一切的异常。打印堆栈跟踪。

答案 1 :(得分:0)

您所描述的情况是不可能的。你没有正确描述它。你的观察可能有问题。

我强烈怀疑IOException或FileNotFoundException,尽管你在另一个答案中发表评论。您已发布了至少在四个不同位置忽略异常的代码。推定是压倒性的。

事实上,您的异常处理需要大量工作。例如,如果出现异常,您不会关闭该文件。没有最后的块。你有多个try / catch块,你应该尝试一次和多次捕获。

其他问题的其他问题。是否正在创建文件?长度非零?或者也许单身类只有瞬态字段?