MessagePack for Java 、jackson-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();
}