はじめに
ScalaでMessagePackがやってみたくて、色々なライブラリを調べてみたところ、このmsgpack4zが一番メンテされてそうな雰囲気がしたので試してみたところ、難儀したもののうまくいったので自分向けにメモ。
msgpack4zの特徴
(他に比べると)よくメンテされている、実装がシンプル。ScalaJS対応。Scalaz依存。悪く言えばこのblogが作者以外がmsgpack4zについて書いた最初のblogというレベルの文章の少なさ。
参考リンク
http://msgpack.org/ja.html
MessagePack公式。特に仕様とか
https://github.com/msgpack4z
GitHub。最後はソースコード頼み
https://xuwei-k.hatenablog.com/entry/20150106/1420506917
作者のブログ。作成の経緯とか設計とか書いてある。
https://gist.github.com/xuwei-k/5e902a3875153cffa25f48ba7def4188
サンプル書いてほしいってお願いしたら作者からもらったやつ。大変良くできているのでこれ1つあればとりあえず動かせるとおもう。ただお願いしたときにmsgpack4z-circeとかの仕様について勘違いがあって、msgpack4z-circeの使い方をお願いしたけどぼくがやりたい事的にはいらなかったというオチがある。(のでcirceまわりは除けばそのまま普通の使い方になる)
Codecの追加
UUIDのCodecが必要なので追加。文字列に変換するだけで良いのでこんな感じか。
import java.util.UUID
import msgpack4z._
import scalaz.\/
object MyMsgPack {
implicit object UUIDCodec extends MsgpackCodec[UUID] {
override def pack(packer: MsgPacker, a: UUID): Unit = packer.packString(a.toString)
override def unpack(unpacker: MsgUnpacker): UnpackResult[UUID] =
\/.fromTryCatchNonFatal(UUID.fromString(unpacker.unpackString()))
.leftMap(Err)
}
}
/はscalazのEitherで、Scala本体のEitherよりリッチなもの、という認識。unpackは失敗する可能性があるのでEitherを返さないといけない。
デバッグ
書けたけどこれどうやって正しいデータかテストするよ、という問題がMessagePack共通であるのだが、msgpack-toolsにmsgpack2jsonというコマンドがあり、curlの結果をこのコマンドで処理すれば問題なく見れる。
その他
Codecが不足している旨のコンパイルエラーが出たら、サンプルのGistにあったcase classのmapperを実装して、msgpack4z._
とmsgpack4z.CodecInstances.all._
をimportすれば殆ど解決する筈。Good luck!