LoginSignup
1
1

More than 5 years have passed since last update.

Javaオブジェクトを msgpack Array型にシリアライズ・デシリアライズする

Last updated at Posted at 2015-12-09

MessagePack for Javajackson-databindを使ったJavaオブジェクトのシリアライズ・デシリアライズをサポートしています。ただし、デフォルトではJavaオブジェクトはMap形式にマッピングされてしまうため、一工夫が必要です。

msgpackのArray型にシリアライズ・デシリアライズシたい場合、そのオブジェクトのクラスにアノテーションを指定します。以下はアノテーション指定の例です。クラスのフォーマットがARRAYであることを示しています。

@JsonFormat(shape=JsonFormat.Shape.ARRAY)
public class Point {
    private int x;
    private int y;

    public Point() {}
    public Point(int x, int y) {this.x=x;this.y=y;}

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

シリアライズする場合はObjectMapperを使います。初期化にMessagePackFactoryを指定している点に注意してください。ObjectMapperは元々Json向けにできたライブラリであり、これがないとデフォルトではmsgpackは扱えません。

Point p = new Point(1,2);
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
try {
    byte[] bytes = mapper.writeValueAsBytes(p);
    assertThat(bytes[0], is((byte)0x92));
    assertThat(bytes[1], is((byte)1));
    assertThat(bytes[2], is((byte)2));
    Point p1 = mapper.readValue(bytes, new TypeReference<Point>(){});
    assertThat(p1.getX(), is(1));
    assertThat(p1.getY(), is(2));
} catch (IOException e) {
    e.printStackTrace();
}

デシリアライズも簡単です。

byte[] a = new byte[]{(byte)0x92,1,2};
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
try {
    Point p = mapper.readValue(a, new TypeReference<Point>(){});
    assertThat(p.getX(), is(1));
    assertThat(p.getY(), is(2));
} catch (IOException e) {
    e.printStackTrace();
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1