マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

MessagePack for Java 0.4を使ってみる

すでに0.5の開発版がでているのだが、あえてここは0.4を使う。なぜなら、まだ0.5の使い方がわからないから!ただし、0.4も開発版である。使い方はhttp://d.hatena.ne.jp/viver/20101025/p1に載っている。コンパイル時にMessagePackが、実行時にMessagePackとjavassist、slfが必要になる。pom用意されてるのでMaven使いましょうってところだ


とりあえず動的コード生成を利用したサンプルをほんのちょっといじったソースコードを載せる。インスタンス変数はpublicにしておかないと、デシリアライズ時に値が代入されない模様。また、引数無しコンストラクタを用意しておかないとエラーになる点に注意。しかし、そこさえ気をつければアノテーション付けるだけでシリアライズ、デシリアライズできるようになるという凄まじい便利さがある。また、MessagePackの一番重要な所は速さであり、若干結果は変わってるだろうがベンチマークを見るとJavaのSerializableの10倍以上高速という結果がでている。この使いやすさでこの速さがでるのはかなり魅力的ではないだろうか?シリアライズ・デシリアライズするならMessagePackは試しておくべきだろう

import org.msgpack.MessagePack;
import org.msgpack.annotation.MessagePackMessage;

public class Main {
    // ユーザー定義のクラス
    // アノテーションを付ける
    @MessagePackMessage
    public static class MyClass {
        public String name;
        public double num;

        public MyClass(){

        }

        public MyClass(String name, double num){
            this.name = name;
            this.num = num;
        }

        public String getName(){
            return name;
        }

        public double getNum(){
            return num;
        }
    }

    public static void main(String[] args) {
        MyClass src = new MyClass("msgpack", 0.4);

        // シリアライズ
        byte[] raw = MessagePack.pack(src);

        // デシリアライズ
        MyClass dst = MessagePack.unpack(raw, MyClass.class);

        System.out.printf("%s %1.2f\n", dst.getName(), dst.getNum());
    }
}