MessagePack for C#を使ってみる

はいどーもこんばんは人生のセーブデータを作り直したいニートです。
本日はMessagePack for C#を使ってみたいと思います。
UniRxの作者さんが作ったものっぽいですよ。

MessagePack for C#ってなんやねん

要はシリアライザーです。
Unityを使っている方ならJsonUtilityは使ったことがあると思いますが、これがなんやかんやで高速になったものです。
また、JSONではなく、MessagePackというフォーマットでシリアライズがおこなわれます(JSON形式にシリアライズしたりデシリアライズしたりもできるようですが)。

JsonUtilityじゃダメなの?

僕が作成したストレージマネージャー(セーブデータの保存と読み込みを行う)はJsonUtilityを使用しています。
ですが「怒りのISerializationCallbackReceiver」でも触れた通り、JsonUtilityはわりと不便です。
なので別のもう少し融通がきくシリアライザーを探していて、JSON.NETの利用も検討していたのですが、これはそもそもUnityでの使用を想定したものではないです(多分)。
できればUnityでの使用も想定してくれているシリアライザーが欲しいですよね。
すると「ZeroFormatter」なるものが見つかったのですが、作者さんから以下のアドバイスをいただきました。


というわけで「MessagePack for C#」の利用を決めた次第です。

使ってみる

なにはともあれ使ってみましょう。
Unity用のものはGitHubから入手できます。
https://github.com/neuecc/MessagePack-CSharp/releases
僕は最新版を落としました。
あとはインポートするだけです。

さてインポートが完了したら、ドキュメントに沿ってシリアライズしたい(僕の場合はセーブデータとして保存したい)クラスを作成してみます。

見ての通りなのですが、シリアライズしたいクラスにはMessagePackObject属性が必須のようです。
また、シリアライズしたいフィールドにはKey属性が必須です。
Keyの型にはstring型とint型が選べるようです。シリアライズするとき配列を使うかMAPを使うかが変わるみたいですね。
これがどういう差を生むのかいまいちわからんので、とりあえず今回はint型でやってみます。

さて次はシリアライズとデシリアライズを実際におこなってみたいと思います。
というわけでコードをドン。

たぶんJsonUtility使ってたら直感的にわかると思うので、細かい説明は省略します。
注目してほしいのはHashSetがシリアライズできているところです。
JsonUtilityはできなかったので、これは大変に便利ですね!
しかもJsonUtilityより早いと言うのですから、もう使わない手はないと、そういうわけなんですね。

ちなみにJSON形式に変換もできるっぽいですが、外部に公開する何やかんやならアリかもしれませんけど、セーブデータとして使うなら別に変換しなくていいんじゃないかな……。
あとISerializationCallbackReceiver的なこともできるっぽいです。

終わりに

高速&直感的&便利ということで、使うの決定しました
現在取り組んでいるプロジェクトはひとまず今のままのストレージマネジャーでいきますが、次回のゲームに向けて基盤の改造に取り組んでもいいかもしれませんねえ。

ただドキュメントが結構膨大なので、僕の知らない便利機能や落とし穴があるやも。
例えばKeyが何を意味してるのかぶっちゃけよくわかりませんw
斜め読みくらいしときましょうかね。

ほなそんな感じまた。

フォローする