MessagePackはJSONのようなデータをシリアライズできるbinary formatで、JavaScript実装である msgpack-javascriptを基準で考えると次のような特徴があります:
- JSONよりencodeもdecodeも少し速い
- かつ、streaming decodeができるので
fetch()
のresponseのdecodeの効率がとてもよい - とはいえ実用上は「JSONより遅くない」ということのほうが重要ではある
- かつ、streaming decodeができるので
- binaryを直接扱える
- これに対してJSONでbinaryを扱うときははbase64などでエンコードする必要がある
- timestamp型があり、デフォルトではJSのDateにマッピングされる
- Intl.DateTimeFormatへの入力としてならこれで必要十分
- マッピングをあとから変えることはできる
特にバイナリを直接扱えるのはJSONとくらべて非常にすぐれた点で、たとえばGraphQL APIを実装するときはファイルのアップロードの扱いに常に悩まされるわけですが、MessagePackを使えばオーバーヘッドなしにバイナリを扱えます。
あとは現在は手元にコードは一切ないのですが、GraphQL schemaを読みながら適切にGraphQLのcustom scalar typeを適切なオブジェクトにマッピングするMessagePack decoderがあるとさらに捗りそうです。
MessagePackを単なるJSONの代替として考えるとJavaScript的にはメリットに乏しいのですが、JSONよりも表現が豊富で拡張性にすぐれたシリアライズフォーマットと捉えるとGraphQLと相性がいいなあ…ということを考えています。というわけで最近MessagePack for JavaScriptの実装を頑張っているのでした。まずは優れた実装がないと話になりませんからね。