どの実装を使うか?
Unity4.5.1 (iOS) 上で msgpack/msgpack-cli がうまく動かなかったので、masharada/msgpack-unity を使った。
どのPackerを使うか?
msgpack-unityには以下3種類のPackerが存在する
- BoxingPacker
- ObjectPacker
- CompiledPacker
結果から言うと ObjectPacker を使った。
BoxingPacker はあらかじめクラスの定義等は必要無いが、プリミティブな型しかサポートしておらず文字列(string型)の扱いが難しいので除外。
CompiledPacker は動的にシリアライズ・デシリアライズ用のアセンブリを生成することで高速に動作するっぽいが、iOSアプリでは動的なコード生成は行えないので除外。
結果として、 ObjectPacker を使用することにした。
利用手順
1. Pack/Unpack の対象となるデータ構造をクラスで定義する
たとえば以下のような構造の MsgPack データをやりとりすると仮定する(※便宜上Jsonで表現)
{
"id" : 1,
"name" : "Nanashi Taro",
"age" : 25
}
このデータ構造と同等のクラスとして以下のようなクラスを定義する。
public class SampleData {
uint id;
string name;
unit age;
}
2. Pack してみる
前述のデータを ObjectPacker でPackしてサーバに送信するコードは以下のように記述する
var data = new SampleData {
id = 1,
name = "Nanashi Taro",
age = 25
};
var packer = new MsgPack.ObjectPacker();
byte[] body = packer.Pack(data);
var headers = new Dictionary<string, string>();
headers["Content-Type"] = "application/x-mpac";
WWW www = new WWW("http://yourhost/api", body, headers);
yield return www;
3. Unpack してみる
前述のデータをサーバから受け取り、Unpackするコードは以下のようになる。
WWW www = new WWW("http://yourhost/api");
yield return www;
var packer = new MsgPack.ObjectPacker();
var result = packer.Unpack<SampleData>(www.bytes);
Debug.Log(result.id);
Debug.Log(result.name);
Debug.Log(result.age);