MessagePack for C#でPrivateメンバーをシリアライズする

はいどーもUniRxボチボチ使い始めている無職です。
本日はMessagePack for C#を使ってPrivateメンバーをシリアライズする方法を書いてみたいと思います。
とは言え当然ドキュメントにもPrivateメンバーをシリアライズする方法はちゃんと書かれています
基本的には作者さんの書いたものが一番正確だと思うのですが、いかんせん英語なので、迷ったときに探すのが手間です。
ちゅーわけで僕のこの記事は僕の備忘録も兼ねていますよ。

なおMessagePack for C#ってなんぞという方は前回の記事を参考にしてください。

Privateメンバーをシリアライズする方法

Privateメンバーをシリアライズする方法はいくつかあるようなのですが、最も簡単なのはDefaultResolverを指定する方法でしょう。
例えば任意のタイミングで以下のように書きます。

注*引数の意味はドキュメントのExtension Point(IFormatterResolver)を参照すると色々説明が書いてありますが、結構ややこしいです。とりあえずここではデフォルトの挙動+privateメンバーを許可するものを使っています。

こう書くとPrivateメンバーをシリアライズできるようになります。

もう一つはシリアライズ時に第二引数にResolverを指定する方法です。
例えば以下のような感じです。

僕は「シリアライズ時に第二引数にResolverを指定する方法」を実際のプロジェクトで使用していますが、まあ好きな方でいいんじゃないでしょーか。

全体のサンプル

コピペで試せるサンプルも置いときます(UniRx必須)。

よくわからなかった点

たぶんResolverの指定方法がマズイのだと思いますが、ジェネリック型や複雑な継承関係を用いると、どうもprivateメンバーがうまくシリアライズできないようでした。
全く同じクラス構成でもpublicなら問題なくシリアライズできるので、ジェネリック型や複雑な継承関係を用いるクラスをシリアライズしたいとき、僕はとりあえずpublicでやろうと思います(Privateを許可するResolverでもそうでないResolverでも同じだった)。
MessagePack for C#はセーブデータの保存機能に使っているので、あんまり複雑なものは基本的にシリアライズしないし、まあ問題ないですかね……。
ただメモリ改ざん検知用のクラス(値型をラップしている)だけかなり複雑な構成なんですよね……。
不具合が出ないか心配ですが、とりあえずはこのまま使ってみますよ。

終わりに

MessagePack for C#はUniRxと同じ作者さんとのことで、本当にプロの中のプロはすごいなあと感嘆するばかりです。
僕もいつかこのレベルまでなってみたいですが、はてさて一体いつになることやら……。
そもそも可能かどうか怪しいですねw

ほなそんな感じでまた。
ゲームも鋭意製作中です。

フォローする