41
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityでMsgPackを使う

Last updated at Posted at 2014-06-16

どの実装を使うか?

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);

参考

41
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?