/******************************************************************************* * Copyright (c) 2015 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ package jsettlers.logic.map.grid; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import jsettlers.common.map.MapLoadException; /** * This class serializes and deserializes the {@link MainGrid} and therefore the complete game state. * * @author Andreas Eberle * */ public class GameSerializer { private static final long SAVE_STACK_SIZE = 1024 * 1024; // size of the save thread's stack private static final long LOAD_STACK_SIZE = 1024 * 1024; // size of the load thread's stack /** * Saves the grid to the given output file. * * @param grid * The grid to use. * @param out * The output file/stream for the game. * @throws IOException */ public void save(MainGrid grid, final ObjectOutputStream oos) throws IOException { GameSaveTask runnable = new GameSaveTask(grid, oos); Thread t = new Thread(null, runnable, "SaveThread", SAVE_STACK_SIZE); t.start(); try { t.join(); } catch (InterruptedException e) { throw new IOException(e); } if (runnable.exception != null) { throw new IOException("Error saving map.", runnable.exception); } oos.flush(); } public MainGrid load(final ObjectInputStream ois) throws MapLoadException { try { LoadRunnable runnable = new LoadRunnable(ois); Thread t = new Thread(null, runnable, "LoadThread", LOAD_STACK_SIZE); t.start(); t.join(); if (runnable.grid != null) { return runnable.grid; } else { throw new MapLoadException("Error loading map.", runnable.exception); } } catch (Throwable t) { throw new MapLoadException(t); } } private final class GameSaveTask implements Runnable { private final MainGrid grid; private final ObjectOutputStream oos; Throwable exception = null; private GameSaveTask(MainGrid grid, ObjectOutputStream oos) { this.grid = grid; this.oos = oos; } @Override public void run() { try { oos.writeObject(grid); } catch (Throwable t) { t.printStackTrace(); this.exception = t; } } } private static final class LoadRunnable implements Runnable { private final ObjectInputStream ois; MainGrid grid = null; Throwable exception = null; private LoadRunnable(ObjectInputStream ois) { this.ois = ois; } @Override public void run() { try { grid = (MainGrid) ois.readObject(); } catch (Throwable t) { t.printStackTrace(); this.exception = t; } } } }