Hatena::ブログ(Diary)

revamping RSSフィード

2012-01-04

[java][bson]POJOをBSON形式でシリアライズする

JavaオブジェクトをBSON形式でファイルに保存する為、いくつかの実装を試してみました。

BSONのバイナリに変換できるライブラリ

BSONのページのImplementationJava実装が列挙されている為、今回はこれらを試してみました。

  1. mongo-java-driver
  2. bson4jasckson
  3. ebson

mongo-java-driver

名前にあるとおりMongoDBドライバですが、BasicBSONEncoderを使って、Javaオブジェクト(BSONObjct)を直接BSONのバイナリに変換することもできます。バイナリからBSONObjctに戻すには、BasicBSONDecoderを使います。

bson4jasckson

JSONを扱うJacksonFactoryを拡張してBSONを扱えるようにしたのがbson4jascksonです。Jacksonと同様、ObjectMapperを使うとPOJOを直接BSONのバイナリに変換することができます。

    @Test
    public void testSerialize() throws JsonGenerationException, JsonMappingException, IOException{
        Employee emp = new Employee();
        emp.setA(76);
        emp.setName("babb");
        emp.setSal(Integer.MAX_VALUE-2);

        //serialize
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectMapper mapper = new ObjectMapper(new BsonFactory());
        mapper.writeValue(baos, emp);
        byte[] buffer = baos.toByteArray();

        // deserialize
        ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
        Employee dst = mapper.readValue(bais, Employee.class);
        assertThat(dst.getA(), is(76));
        assertThat(dst.getName(), is("babb"));
        assertThat(dst.getSal(), is(Integer.MAX_VALUE-2));
    }

また、Jacksonは複数のシリアライズ方法を提供しており、ObjectMapperに任せると都合が悪い場合はmongo-java-driverのBSONObjectのような汎用型を扱うTreeModel、さらに細かく調整する場合にはStreamingAPIを使うこともできます。詳細は以下のURLに記載されています。

http://wiki.fasterxml.com/JacksonFAQ#Processing_Models

ebson

これはスクラッチで作成されたBSON実装です。サマリには「Extensible BSON encoder/decoder library written in Java with pluggable Java-to-BSON type mappings.」とあり、独自のマッピングを記述しやすいのが特徴です。

残念なのは、APIインターフェースにByteBufferが使用されていること。ByteBufferは途中でcapacityを変更できない為、ちょっと使いづらかったというのが正直な感想です。

代わりにコードはかなり整理されており、参考になる点が多数ありました。

まとめ

POJOを直接BSONバイナリに変更したい場合はbson4jascksonのObjectMapperが便利ですが、特殊なマッピングを行うのであればebsonも面白いと思います。MongoDB絡みで連携可能な既存資産があれば、mongo-java-driverかな。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hsyd/20120104/1325688168
リンク元