Skip to content

MS_MessagePack

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

MessagePack

概要

  • バイナリエンコード手法の一つ

    • ビッグデータ業界とゲーム業界でよく使われているらしい。
    • メジャーなプログラミング言語で MessagePack が実装されている。
    • Google が公開した Protocol Buffers 対抗(こちらは IDL が必要)
  • 互換ライブラリが揃っているため、
    多くの言語でクロスプラットフォームで利用できる。

補足: JSON との関係で言うと、 MessagePack は「JSON と同じデータモデルを、スキーマ無しでバイナリにする」 位置付けである。

スキーマ 形式 代表
スキーマあり IDL が必要 バイナリ Protocol Buffers
スキーマなし 不要 バイナリ MessagePack、CBOR
スキーマなし 不要 テキスト JSON

スキーマが無いぶん導入は容易だが、 フィールド名が毎回電文に乗るため、 Protocol Buffers ほど小さくはならない。

詳細

補足: 「文字列とバイナリの扱い」の争点を補足しておく。 初期の MessagePack には raw 型しか無く、 UTF-8 文字列とバイナリを区別できなかった。 型なし言語では困らないが、 文字列とバイト列を区別する言語(C#、Java 等)では デシリアライズ時に判別できない。 2013 年の仕様改訂で str 型と bin 型が分離されたが、 この非互換な変更が「ゴタゴタ」の中身である。 現行の実装は str/bin 分離後の仕様に対応している。

.NETでの利用

補足(最新化): .NET では MessagePack for C#(neuecc 氏)が 事実上の標準実装である。 属性でキーを指定でき、コード生成により高速に動作する。

[MessagePackObject]
public class Person
{
    [Key(0)] public int Id { get; set; }
    [Key(1)] public string Name { get; set; }
}

[Key(0)] のように整数キーを使うと、 フィールド名が電文に乗らないため大幅に小さくなる (ただしフィールドの順序が契約になるため、 互換性の管理が Protocol Buffers 的になる)。

なお、ASP.NET SignalR の後継である ASP.NET Core SignalR では、 MessagePack をハブ プロトコルとして選択できる。

補足(セキュリティ): MessagePack に限らず、 型情報を電文に含めるシリアライザ (MessagePack for C# の TypelessContractlessStandardResolver、 Json.NET の TypeNameHandlingBinaryFormatter など)は、 信頼できないデータを受け取ると デシリアライズ時の任意コード実行につながる。 外部から受け取る電文では、必ず型を固定して受けること。

参考


Tags: IT国際標準, プログラミング, 通信技術, .NET開発, .NET Core, ASP.NET, ASP.NET Web API

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally