シリアライズの問題

 バージョン間でセーブデータを使えるようにするのは格別難しい。XMLのような抽象度の高いデータを一々変換してデータを作るとうまくいきやすいが、変換するのが大変だ。オブジェクト→XMLはそうでもないが、XML→オブジェクトがやや難しい。バージョンが変わるたびに変換処理が増えていきなんか破綻しそうになる。

 そこで考えたのが、オブジェクトに値を入れるソースコードを生成する方法だ。これをCSharpCodeProviderでコンパイルして実行して元のオブジェクトを作る。読めば完全にどうオブジェクトが構築されるか分かるし、一緒にVisual Studioのプロジェクトファイルも出力するようにしたので、Visual Studioでプロジェクトを読み込んでコンパイルすれば、コンパイルエラーを直していくだけで新バージョンへのコンバートが完成する。開発中はしょっちゅうデータ形式が変わるけど、一つのデータをコンバートさえ出来れば事足りることは多い。あと参照が直接扱えるのも便利だ。

 セーブデータを開くたびにコンパイルして作ったアセンブリが溜まっていくので、これをアンロードするためにAppDomainを使わなきゃいけないのが多少めんどくさかったけど案外簡単に出来た。なかなかいい感じだが本番でやるにはセキュリティの問題が大きく出てくる。多分newとstaticメソッド呼び出しとGetTypeとtypeofを禁止して、呼び出してもいいメソッドを集めたユーティリティークラスのインスタンスを渡して必要なメソッドはそこに記述するようにすれば解決できそうな気はしている。

 C#ソースコードで表される何物かしかない。謎のバイナリデータも冗長なテキストデータもない。データがないから変換処理もない。なのにオブジェクトのデータは誰が読んでも分かる形で永続化されているのだ。なかなかよい思い付きだ。