#MessagePack新バージョンへの対応「案」 (perl)
https://gist.github.com/frsyuki/5019759 を Perl で実装する場合のインターフェイスについて
動作確認せずに書いてます。すみません。
##現行MsgPackと新バージョンの切り替え
"MessagePack2" という名前で新バージョンに言及すべきかについては、議論があります。 https://gist.github.com/frsyuki/5019759#comment-780143
##バイナリ型の表現
文字列結合演算子等を適用した際(stringificationが発生する際)に、バイナリデータを文字列として返すオブジェクトとして実装すべきだと考えます(つまり use overload fallback => 1, '""' => sub ... する)
この理由は、MessagePack2に移行後も変更なしで使い続けることができます(なぜなら、「特殊な文字列」としてバイナリを表現することになるから。ただし新方式では文字列にはutf_8フラグがついているだろうから、従来の方式で返ってきたデータを問答無用でEncode::decode_utf8しているようなコードだと変更が必要になるかも)。
###バイナリ型か否かの判定
こんな感じでできるようにすればいいと思います。
my $is_binary = Data::MessagePack2::is_binary($data);
実装としては、以下のような感じでしょうか。
sub is_binary {
return $data = shift;
return (ref($data) || '') eq 'Data::MessagePack2::is_binary';
}
##エンコード
以下例。hidek画像以外は全部文字列になる
use utf8;
my $mp = Data::MessagePack2->new;
my $packed => $mp->pack({
id => 3,
name => 'hidek',
description => '48回目の生誕祭',
png => $mp->binary($hidek_png_data),
});
##デコード
デコーダについては、上記のとおり、何もかわりません。