- 効率的なバイナリシリアライズ形式
- JSONのように複数言語間でデータ交換が可能
- 小さな整数は単一バイトでエンコードされ、短い文字列は文字列自体に追加で1バイトだけ必要
- 50以上のプログラミング言語と環境でサポート
- ユースケース:
- Redis: Lua向けのMessagePack C拡張を追加し、データシリアライズに活用
- Fluentd: 内部データ表現にMessagePackを使用し、高速処理が可能
- Treasure Data: 分析クエリに最適化されたマルチテナントデータベースを構築
- Pinterest: MessagePackとMemcacheでフィードキャッシュを圧縮し、高速処理
2つのコンセプト: "Type System" と "Format"
- 型システム
- Integer: 整数
- Nil:
null 値
- Boolean:
true または false
- Float: IEEE 754浮動小数点
- Raw: 文字列またはバイト配列
- Array: オブジェクト配列
- Map: キー・バリューの組
- Extension: ユーザー定義型
- フォーマット
- positive fixint, negative fixint, fixmap, fixarray
- nil, false, true
- bin 8/16/32, ext 8/16/32, float 32/64
- uint 8/16/32/64, int 8/16/32/64, fixext 1/2/4/8/16, str 8/16/32
- array 16/32, map 16/32
- フォーマット例
fixint: 7ビット整数(正数は0x00–0x7F、負数は0xE0–0xFF)
fixstr: 最大31バイトの文字列
array 16: 最大 (2^16)-1 要素を持つ配列
map 16: 最大 (2^16)-1 キー・バリュー組
MessagePackの利点
- データサイズの最小化と速度の最適化
- 既存のJSONベースアプリケーションの代替および改善
- シンプルな実装で、さまざまな環境で柔軟に活用可能
4件のコメント
ゲームサーバーと通信する際にMessagePackを適用しようとしたのですが……説明にあるような多様な環境での柔軟性があまりうまく機能しませんでした。なので、protobufを使いました。
私がよく分かっていないだけかもしれませんが……JSONの代わりにサイズや速度のためにhexで直列化するのであれば……昔のように単にバイナリ直列化を使っていた時代と何が……違うのでしょうか?
単にバイナリで出力すると、それを出力した言語とランタイムでしか有効ではありませんが、そのようなフォーマットはたいてい、異なる言語や異なる環境との間でやり取りすることを前提に作られています
ああ、そうなんですね。ご回答ありがとうございます。