[Java] シンプルなセーブデータのオブジェクトを設計してみました ~ Serializable

ゲームなどでセーブデータを管理するためのオブジェクトのひな形を作りました。

Serializableインターフェースの使い方の実例になると思います。

screenshot.1495686911

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ずつ増えていきます。

screenshot.1495685766

mainを見ていただくとわかるように、

saveメソッドで保存し、

loadメソッド(生成のクラスメソッド)で復元します。

バイナリエディタで中身を見て見ると・・・

 

screenshot.1495686110

暗号化などの処理はしていないので、興味があれば研究してみてください。

参考URL

 

保存・読み込み処理は、保存する(ゲーム状態の復元に必要な)パラメータが追加されたら、すぐにそれを保存・読み込めるように実装します。これを怠って後でまとめて実装しようとすると、複雑になって実装が難しくなります……。また、保存・読み込みの機能を常に使用可能な状態にしておくと、何か問題が起きたときの再現・テスト・動作確認が、素早く簡単にできるようになります。

なので、 保存・読み込みは、いつでも使えるように、しっかりメンテナンスしておきましょう。