Skip to content

Instantly share code, notes, and snippets.

@kazuho
Last active December 14, 2015 03:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazuho/5021721 to your computer and use it in GitHub Desktop.
Save kazuho/5021721 to your computer and use it in GitHub Desktop.
MessagePack新バージョンへの対応「案」 (perl)

#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),
});

##デコード

デコーダについては、上記のとおり、何もかわりません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment