ゲームなどでセーブデータを管理するためのオブジェクトのひな形を作りました。
Serializableインターフェースの使い方の実例になると思います。
SaveData.java
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class SaveData implements Serializable{ private static final long serialVersionUID = 9221767827371311543L; public String name; public int number; public InnerObject obj; public static class InnerObject implements Serializable { private static final long serialVersionUID = 6103171382897938196L; public int a; public int b; } public void save(String filepath) throws FileNotFoundException, IOException { ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream(filepath)); os.writeObject(this); os.close(); } public static SaveData load(String filepath) throws FileNotFoundException, IOException, ClassNotFoundException { ObjectInputStream is = new ObjectInputStream( new FileInputStream(filepath)); SaveData instance = (SaveData) is.readObject(); is.close(); return instance; } public static void main(String[] args) { SaveData data; try { data = SaveData.load("save.dat"); } catch (Exception e) { data = new SaveData(); data.name = "abc"; data.number = 0; data.obj = new SaveData.InnerObject(); data.obj.a = 10; data.obj.b = 20; } data.number = data.number + 1; System.out.println(data.name); System.out.println(data.number); System.out.println(data.obj.a); System.out.println(data.obj.b); try { data.save("save.dat"); } catch (IOException e) { e.printStackTrace(); } } }
データが保存されるので、data.numberの値は実行するたびに1ずつ増えていきます。
mainを見ていただくとわかるように、
saveメソッドで保存し、
loadメソッド(生成のクラスメソッド)で復元します。
バイナリエディタで中身を見て見ると・・・
暗号化などの処理はしていないので、興味があれば研究してみてください。
参考URL
保存・読み込み処理は、保存する(ゲーム状態の復元に必要な)パラメータが追加されたら、すぐにそれを保存・読み込めるように実装します。これを怠って後でまとめて実装しようとすると、複雑になって実装が難しくなります……。また、保存・読み込みの機能を常に使用可能な状態にしておくと、何か問題が起きたときの再現・テスト・動作確認が、素早く簡単にできるようになります。
なので、 保存・読み込みは、いつでも使えるように、しっかりメンテナンスしておきましょう。