Сохранение объекта-одиночки - PullRequest
1 голос
/ 06 июня 2011

Я знаю, что этот сайт не предназначен для подобных вопросов, но я искал ответ на этот вопрос, я ничего не нашел и мне нужны подтверждения.

У меня есть одноэлементный класс, который является центром моей программы, в некоторых ситуациях я пытаюсь сохранить его состояние, однако кажется, что оно не сохраняется должным образом, и я не понимаю, почему, потому что это не первый раз сделать это, однако это первый раз, когда я пытаюсь сохранить одноэлементный, так возможно ли сохранить одноэлементный объект? Вот мои коды загрузки и сохранения этого объекта

 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();
        }

}

EDIT

Хорошо, я, возможно, объяснил более корректно, это не дает мне никакой ошибки загрузки, однако это не загружает состояние, которое я сохранил, оно загружает новую "Logica", как будто я создал новую

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Синглтон сам по себе ничего не говорит о том, что его нельзя сериализовать; Вы можете написать неправильный код сериализации для любого класса. Непонятно, что не так, и я не хочу разбираться с вашим кодом, чтобы понять это, но это должно быть возможно.

У вас есть пустой блок catch для IOException. Это всегда плохая идея. Вы проглотили исключение, которое может объяснить все. Распечатать трассировку стека.

0 голосов
/ 06 июня 2011

Описанная вами ситуация невозможна. Поэтому вы не правильно описали это. Возможно, что-то не так с вашими наблюдениями.

Я сильно подозреваю IOException или FileNotFoundException, несмотря на ваш комментарий в другом ответе. Вы разместили код, который игнорирует исключения, по крайней мере, в четырех разных местах. Презумпция ошеломляющая.

На самом деле ваша обработка исключений требует много работы. Вы не закрываете файл в случае, например, исключений. Там нет, наконец, блоков. У вас есть несколько блоков try / catch, в которых вам нужно сделать одну попытку и несколько уловов.

Дополнительные вопросы по другим направлениям. Файл создается? С ненулевой длиной? Или, может быть, у синглтон-класса есть только переходные поля?

...