-
Notifications
You must be signed in to change notification settings - Fork 0
MS_MessagePack
- 戻る(WebAPI、その他、開発の色々(
MS_MiscDevelopmentTopics.md))- XML
- JSON
- MessagePack
- Protocol Buffers
- CBOR
-
バイナリエンコード手法の一つ
- ビッグデータ業界とゲーム業界でよく使われているらしい。
- メジャーなプログラミング言語で MessagePack が実装されている。
- Google が公開した Protocol Buffers 対抗(こちらは IDL が必要)
-
互換ライブラリが揃っているため、
多くの言語でクロスプラットフォームで利用できる。
補足: JSON との関係で言うと、 MessagePack は「JSON と同じデータモデルを、スキーマ無しでバイナリにする」 位置付けである。
スキーマ 形式 代表 スキーマあり IDL が必要 バイナリ Protocol Buffers スキーマなし 不要 バイナリ MessagePack、CBOR スキーマなし 不要 テキスト JSON スキーマが無いぶん導入は容易だが、 フィールド名が毎回電文に乗るため、 Protocol Buffers ほど小さくはならない。
-
業務系ではあまり使われなかった
- DataTable などの複雑なオブジェクト送受信などを行うので。
- これには、オブジェクトのバイナリ・シリアライズを使用していた。
-
標準に乗らなかった。
-
汎用データフォーマット「MessagePack」、IETFでの標準化でゴタゴタが発生中 | スラド
- 後方互換のため現開発者が改良案に反対を表明
- 問題とされているのは文字列とバイナリの扱い
- 後継は、CBOR と言われている。
-
汎用データフォーマット「MessagePack」、IETFでの標準化でゴタゴタが発生中 | スラド
補足: 「文字列とバイナリの扱い」の争点を補足しておく。 初期の MessagePack には raw 型しか無く、 UTF-8 文字列とバイナリを区別できなかった。 型なし言語では困らないが、 文字列とバイト列を区別する言語(C#、Java 等)では デシリアライズ時に判別できない。 2013 年の仕様改訂で
str型とbin型が分離されたが、 この非互換な変更が「ゴタゴタ」の中身である。 現行の実装は str/bin 分離後の仕様に対応している。
補足(最新化): .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 のTypeNameHandling、BinaryFormatterなど)は、 信頼できないデータを受け取ると デシリアライズ時の任意コード実行につながる。 外部から受け取る電文では、必ず型を固定して受けること。
- WebAPI
- Protocol Buffers
- CBOR
- MessagePack: JSONをもっと速く、小さく。
- MessagePack - Wikipedia
- MessagePack for C# - GitHub
- バイナリシリアライズ形式「MessagePack」 - Blog by Sadayuki Furuhashi
Tags: IT国際標準, プログラミング, 通信技術, .NET開発, .NET Core, ASP.NET, ASP.NET Web API
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。