vmihailenco/msgpackの非互換に対応する
Goで使ってるMessagePackのライブラリで非互換な更新があってそれに対応したメモです。
そもそもの非互換
従来の挙動: 数値型を可能な限り小さい数値型表現で格納していた。
現在の挙動: #198でデフォルトではGoの型に対応する数値型表現で格納されるようになった。
例で示すと:
var v int64 = 10
b, err := msgpack.Marshal(v)
// 従来: `b` は埋め込み整数型
// 現在: `b` はint64_t表現型
のような感じになっています。
テストで一応確認してたので、どうゆうわけかテストが失敗していて気づきました。
対処方法
var buf bytes.Buffer
var v int64 = 10
enc := msgpack.NewEncoder(&buf).UseCompactEncoding(true)
err := enc.Encode(v)
b := buf.Bytes()
// 従来どおりの `b` が生成されている
といった、 msgpack.Encoder
を使った方法に切り替えます。
3行くらい増えるので若干めんどうになります。
総評とか
Goでの Encode
/ Decode
操作はストリーム型を使った方が効率的になることもあるので、たまには使ってみるのもよいかと思います。
長くなるのでめんどうですが。