Как загрузить игру, используя входной поток файла/объекта

Я написал методы сохранения/загрузки (не уверен, что сохранение работает, но файл «minesweepersavestate.ser» появляется в папке моего проекта после вызова saveGame()). Я хочу попытаться заставить нагрузку работать, потому что в настоящее время она, похоже, ничего не делает.

Вот мои функции:

   public void saveGame(){

        GameBoard b = new GameBoard();
        try {
            System.out.println("Creating File/Object output stream...");
            FileOutputStream fileOut = new FileOutputStream("minesweepersavestate.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);

            System.out.println("Writing GameBoard Object...");
            out.writeObject(b);

            System.out.println("Save Successful...\n");
            out.close();
            fileOut.close();

        } catch(FileNotFoundException e) {
            System.out.println("no");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("no");
            e.printStackTrace();
        } 

    }


    public void loadBoard()
    {
        GameBoard b = null;
        try {

            System.out.println("Creating File/Object input stream...");

            FileInputStream fileIn = new FileInputStream("minesweepersavestate.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);

            System.out.println("Loading GameBoard Object...");
            b = (GameBoard)in.readObject();

            System.out.println("Load Successful...\n");
            in.close();
            fileIn.close();

        } catch (ClassNotFoundException e) {
            System.out.println("Class not found\n");
            e.printStackTrace();
        } catch(FileNotFoundException e) {
            System.out.println("File not found\n");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

Как я могу изменить этот метод, чтобы при вызове метода loadBoard() игра возвращалась в том состоянии, в котором она была сохранена?

Редактировать:

Класс игровой доски:

public class GameBoard extends JFrame implements Serializable
{
//MENU ITEMS
private JFrame frame;
private JMenuBar menubar = new JMenuBar();
private JTable table;

//FIELDS USED FOR GAMEPLAY
private int x;
private int y;
private boolean mineTrue;
private boolean triedTrue;
private static int boardsize = 8; 
private  int numberOfMines = 10;
public static final int Empty = 0;
public static final int Mine = -1;
public static final int Flag = -2;
public static final int FMine = -3;
public static final int RevealedMine = -4;
public static final int RevealedEmpty = -5;
// SIZE OF BUTTONS
private int gridsize = 45;
// ARRAY FOR THE BUTTONS
private JButton[][] buttons;
private int[][] board;
//VARIABLE USED FOR LABELS
private static int noGamesPlayed = 0;
private static int noGamesWon = 0;
private int mine = 10;
private int minesLeft = 10;
private static int score = 1;
private static String playername;
// GAME STATUS
private boolean gamegoing = true;
// GAME LABELS

private JLabel space = new JLabel("");
private JTextField nameEnter = new JTextField("Enter name here: ");
private JButton saveName = new JButton("Play");
private JLabel namelabel = new JLabel("Player 1: ");
private JLabel scorelabel = new JLabel("0 points ");
private JLabel status = new JLabel("Game in Progress: ");
private JLabel gamesPlayed = new JLabel("Games Played: " + noGamesPlayed);
private JLabel gamesWon = new JLabel("Games Won : " + noGamesWon);
private JLabel noMines = new JLabel("Number of Mines: " + minesLeft);


/**
 * Constructor 
 */
public GameBoard() { }

/**
 *Making the game Frame
 */
private void makeFrame() { }

// MAKING THE GAME MENU BAR
public void makeMenuBar(){  
}   

public void setx(int pmeter) { }

public void sety(int pmeter) { }

public int getx() { }

public int gety() { }

public void settried(boolean paramBoolean) { }

public boolean gettried() { }

public void setmine(boolean paramBoolean) { }

public boolean getmine() { }

//ASSIGN MINES TO RANDOM LOCATION
public void assignmines() { }

// *********************************GAME CONTROLS************
private void quit() { }

//RESETS THE BOARD
public void reset() { }    

public void newGame() { }

public void biggerBoard() { }

public void changeDifficulty() { }

public void saveGame() { }


public void loadBoard() { }

// LOSING THE GAME ALERT
public void lose() { }

// WINNING THE GAME ALERT
public void win() { }

// UPDATING THE SCORE
public void updatescore() { }

public void gamesPlayed() { }

public void UpdateName() { }

public void updateGamesPlayed() { }

public void updateGamesWon() { }

//WHAT VALUES THE CHARACTER HAVE
static char whichCharacter(int value) { }

//This method shows how many mines are around the spot that was clicked
static int minesAround(int[][] board, int row, int col) { }

// This method takes in an x and y value and defines what should happen when the user clicks there. 
public void click(int rows, int cols) { }

//ACTION WHEN USER CLICKS ON A BUTTON INNER CLASS
private class MouseListener extends MouseAdapter {
    private int x = 0;
    private int y = 0;

    public MouseListener(int row, int col) { }

    public void mouseClicked(MouseEvent e) { }

}

}


person AW90    schedule 19.12.2014    source источник
comment
Получаете ли вы какое-либо исключение при загрузке? Или b просто нуль?   -  person Frozendragon    schedule 19.12.2014
comment
Можете ли вы предоставить схему кода для вашего объекта GameBoard? Объявление класса, поля и сигнатуры методов?   -  person sfedak    schedule 19.12.2014
comment
Отредактировано. На самом деле я только что проверил, теперь сохранение не работает. Я только что получил ошибку: Исключение в потоке AWT-EventQueue-0 java.lang.NullPointerException at GameBoard.click(GameBoard.java:434)   -  person AW90    schedule 19.12.2014


Ответы (1)


Вам нужно убедиться, что все ваши поля в вашем классе Serializable, как предлагает это руководство . Особо следует отметить требования к классу Serializable:

Обратите внимание, что для успешной сериализации класса должны быть выполнены два условия:

Класс должен реализовывать интерфейс java.io.Serializable.

Все поля в классе должны быть сериализуемыми. Если поле не сериализуемо, оно должно быть помечено как переходное.

Это означает, что вам придется немного покопаться в Javadocs для всех полей в вашем классе GameBoard. Например, я сделал быстрый поиск по JFrame, и, кажется, есть что-то вроде нюанс, когда дело доходит до сохранения файла JFrame. Когда вы получаете состояние вашей сохраненной игры, может быть лучше просто воссоздать графический интерфейс с нуля, чем полагаться на Serialization, чтобы сделать это за вас. Этот поток также, похоже, согласен с тем, что не стоит полагаться на Java чтобы восстановить графический интерфейс для вас, но дает предложение о том, как заставить его работать:

после десериализации вам нужно будет показать кадр с frame.setVisible(true);

person sfedak    schedule 19.12.2014