Easy Save2 で シリアライズされたクラスを保存する

前回、Easy Save2 を使ってみる でEasy Save2 を簡単に使ってみた。
クラス内の保存するパラメータが少ないうちは、1つずつセーブしたりロードしたりしてもいいのだが、これが大量になるといちいち記述するのも面倒になる。
Saving and Loading Custom Scriptsを見てもらうとわかるのだが、SaveとLoadで該当するパラメータを全部記載しないといけないので、なかなか骨が折れる。
できることなら、クラス内のパラメータをまとめて保存したい。というわけで、今回はクラスをシリアライズして保存してみる。

以下のようなクラスをサンプルとする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Player {
int hp;
public int Hp {
get {
return hp;
}
set {
hp = value;
}
}
public string MyName { get; private set; }
public Player(string myName) {
MyName = myName;
}
}

BinaryFormatterでバイナリにシリアライズして保存する

BinaryFormatterはクラスをバイナリにシリアライズするものである。使う際には[System.Serializable]の記述が必要なので、以下のように修正。

1
2
[System.Serializable]
public class Player {

BinaryFormatterはstreamを引数に取る必要があるので、MemoryStreamを指定する。これでシリアライズされたデータをbyte配列で取得できる。あとは、このbyte配列をEasy Save2に渡して保存すれば良い。ロードはその逆。以下にソースを示す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Player player = new Player("あいうえお");
player.Hp = 100;
//セーブ.
BinaryFormatter bf = new BinaryFormatter();
MemoryStream saveMem = new MemoryStream();
bf.Serialize(saveMem, player);
ES2.Save(saveMem.ToArray(), "player?tag=binary"); //byte配列で保存.
saveMem.Close();
//ロード.
bf = new BinaryFormatter();
MemoryStream loadMem = new MemoryStream(ES2.LoadArray<byte>("player?tag=binary"));
Player loadPlayer = (Player)bf.Deserialize(loadMem);
loadMem.Close();
print(loadPlayer.MyName); //あいうえお
print(loadPlayer.Hp); //100

これで動くことは動くのだが、非常に残念なことに、BinaryFormatterはiOSだと動かないらしい。
仕方ないのでJSONでも保存してみる。

ListJSONでJSONにシリアライズして保存する

クラスをJSONにシリアライズするのにLitJSONを使う。
準備として、上記ページからLitJSONのdllをダウンロードし、UnityのProjectのPluguinsフォルダに突っ込む。
JSONにシリアライズしたら、stringとして保存すれば良い。ソースを以下に示す。

1
2
3
4
5
6
7
8
9
10
11
12
13
Player player = new Player("あいうえお");
player.Hp = 100;
//セーブ.
string saveJson = LitJson.JsonMapper.ToJson(player);
ES2.Save(saveJson, "player?tag=json");
//ロード.
string loadJson = ES2.Load<string>("player?tag=json");
Player loadPlayer = LitJson.JsonMapper.ToObject<Player>(loadJson);
print(loadPlayer.MyName); //あいうえお
print(loadPlayer.Hp); //100

このままだと実行時にDefault constructor not found とエラーになってしまうので、Playerに以下のデフォルトのコンストラクタを追加する。

1
2
public Player() {
}

これでOK。