あいてぃーとふぼふ

実録☆WP7アプリケーション開発!(第5話)

今回はデータモデルを作成していきたいと思います。設計がしっかりできていればモデルの実装はそれほど難しくありません。

データモデルの実装

WP7の開発環境に付属してる無償版のVSには、データモデルをデザインするためのツールは付属していません。このため、設計図をもとにしてクラスをひとつひとつ手動で作成する必要があります。非常に面倒ですが…開発環境がタダなので文句は言えませんね。実際の実装イメージは左記のとおりです。こんな感じでデータモデルを作成していきます。なお、各プロパティに付与している属性の意味はのちほどご説明します。

シリアライズとデシリアライズ

データモデルは、その名の通りデータを保持するオブジェクトです。このため、分離領域やXMLファイルなど、様々な媒体から取得ないしは保存することを前提とします。今回作成するゲームでも、画面上方から落下してくる音符のタイミングやボタンのインデックス、そのほか楽曲の情報などはXMLファイルから読み込むようにしようと思います。このため、XMLファイルをクラスオブジェクトに変換(デシリアライズ)できるような仕組みが必要となります。また、このXMLファイルはあらかじめ作成しておく必要があるわけですが、手動でチマチマ作成するのは困難です。そこで、実際にゲームをプレイしたデータ(ボタンをおしたタイミングなど)を利用してXMLファイルを作成することができれば、開発工数をグッと短縮できそうです。この場合は逆に、クラスオブジェクトをXMLファイルに変換(シリアライズ)できる必要があるわけです。これらを実現するためには「DataContractSerializer」クラスを利用すると便利です!

「DataContractSerializer」クラスを利用する場合、クラスオブジェクトのシリアライズとデシリアライズは左記の実装例のように実現することが可能となります。肝となるのは「WriteObject」と「ReadObject」メソッドのみですので、そのほかの部分はお好きなように実装してください。たったこれだけの実装で、クラスとXMLファイルを相互に変換することが可能となります。

データモデルに付与した属性

データモデルを作成する際に付与した属性は、「DataContractSerializer」クラスの変換処理に利用されます。「DataContract」属性は、そのクラスがシリアライズおよびデシリアライズ可能であることを示し、「DataMember」属性はそのプロパティを変換の対象にするという意味を持ちます。逆に「IgnoreDataMember」属性を付与すると、そのプロパティを変換の対象から除外することが可能です。たとえば前述したデータモデルの例では、「PositionTimeSpan」プロパティを「IgnoreDataMember」属性により対象外としていますよね。本当は「Position」プロパティをTimeSpan型にすれば「PositionTimeSpan」プロパティなんて不要なのですが、TimeSpanを「DataContractSerializer」で変換すると”PT4.449S”といったヘンテコな文字列になりやがります。できれば時間は”00:00:02.551”みたいな形式でXMLに保存&読込できると後々編集しやすいですよね~。このため、XMLに変換されるのは「Position」プロパティの値のみとし、プログラム側では「PositionTimeSpan」プロパティを利用することにより帳尻を合わせています。こういう使い方が良いかどうかはさておいて、こういう使い方もできるということで…(; ̄ー ̄

そんなこんなでデータモデルの実装はバッチリですね!( `・ω・´)b