2012年4月28日土曜日

[PlayStation Mobile] データを保存する汎用的なクラスを作る [PlayStation Suite]

※PersistentMemoryクラスはver0.99で廃止されました。(2012年7月15日追記)
How to save multipurpose data permanently

PlayStation Suite SDKでデータをファイルに保存する方法について考えてみました。
まず注意点ですが、PlayStation Suite SDKは過去のバージョンアップで次のような仕様変更がありました。

0.96→0.97
HashtableクラスやDictionaryクラスのシリアライズ・デシリアライズができなくなった。
キー・バリュー型のデータをファイルに読み書きすることができなくなりました。

0.97→0.98
Storageクラスが廃止された。

このような仕様変更のおかげでファイルI/O機能を何度も作り直す羽目になりました。
今後も仕様変更により、どんな影響が出るか予想できませんのでご了承ください。

今のところ、比較的簡単で安全と思われる方法を考えてみました。
セーブはstring[]をシリアライズしてPersistentMemoryに書き込む
ロードはPersistentMemoryをデシリアライズしてstring[]に戻す
この機能を MtkPersistenMemory というクラスで作ってみました。

実際のソースです。
MtkPersistenMemory.cs
MtkPersistenMemoryクラスの説明
Publicメソッド
void
SetValue (int key, string myValue)
keyに対応する項目の追加・更新をする
keyは0から63まで
string
GettValue (int key, string defaultValue)
keyに値を取得する、該当する項目がなければdefaultValueを返す
keyは0から63まで
enum
Write ()
SetValueメソッドで追加・更新された内容をPersistentMemoryに永続保存する
戻り値に成功(MtkPersistenMemory.Results.Successed)、または失敗を返す(MtkPersistenMemory.Results.Faild)

※PersistentMemoryクラスを使う都合により次の制限があります。
・保存できる容量は64kB以内
・保存されるタイミングはアプリケーション終了時。アプリケーションが異常終了した場合は保存されません。

MtkStorageを実際に利用するサンプルアプリのソースです。
※このソースはSce.Pss.Highlevel.UIを参照します。
ソリューションエクスプローラーの[参照]を右クリックして[参照アセンブリの編集]でSce.Pss.Highlevel.UIを追加するとビルドできます。
AppMain.cs
MtkPersistenMemoryの使い方の解説です。
(1) PersistenMemoryのインスタンス化
MtkPersistenMemoryはインスタンス化する必要があります。前回の保存内容を自動的にロードします。
例:
MtkPersistenMemory memory = new MtkPersistenMemory();

(2) PersistenMemoryから読み取る
GetValueで第1引数にキーを指定して読み取ります。指定したキーが存在しなければ第2引数の値が返されます。
たとえば
label.Text = memory.GetValue(MtkPersistenMemory.KEY00, "nothing");
の場合、KEY00に保存された文字列があればその内容がラベルに表示されます。
KEY00に文字列が保存されていなければ「nothing」が表示されます。
その他の例:
string value1 = memory.GetValue(MtkPersistenMemory.KEY01, "文字列1");
string value2 = memory.GetValue(MtkPersistenMemory.KEY02, "文字列2");

(3) PersistenMemoryに項目を追加・更新する
SetValueでキーと値の組み合わせを追加します。既にキーが追加されている場合は値を上書きします。
たとえば storage.SetValue(MtkPersistenMemory.KEY00, "....");
の場合、第1引数のMtkPersistenMemory.KEY00に保存された項目が存在すれば、値を第2引数の内容に上書きします。何も保存されていなければ追加します。
その他の例:
memory.SetValue(MtkPersistenMemory.KEY01, "文字列1");
memory.SetValue(MtkPersistenMemory.KEY02, "文字列2");

(4) PersistenMemoryに書き込みと結果のチェック
Writeで全てのキーと値の組み合わせを永続保存します。
戻り値に永続保存の結果を返します。保存する容量が64kBを超えた場合は失敗します。
例:
int result = memory.Write();
result == MtkPersistenMemory.Results.Successed なら成功
result == MtkPersistenMemory.Results.Faild なら失敗

KEY00やKEY02という変数名は、適切な変数名(DATEなど)にリファクタリングするとソースが読みやすくなります。
保存できる項目数が64件では多すぎる・少なすぎるという場合は MtkPersistenMemory.cs のvalues = new string[64]; と MAX_SIZE を改造してください。

以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿