2012-01-04
■ [java][bson]POJOをBSON形式でシリアライズする
JavaのオブジェクトをBSON形式でファイルに保存する為、いくつかの実装を試してみました。
BSONのバイナリに変換できるライブラリ
BSONのページのImplementationにJava実装が列挙されている為、今回はこれらを試してみました。
mongo-java-driver
名前にあるとおりMongoDBのドライバですが、BasicBSONEncoderを使って、Javaのオブジェクト(BSONObjct)を直接BSONのバイナリに変換することもできます。バイナリからBSONObjctに戻すには、BasicBSONDecoderを使います。
bson4jasckson
JSONを扱うJacksonのFactoryを拡張して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かな。
- 2 http://d.hatena.ne.jp/keyword/JSON
- 2 http://d.hatena.ne.jp/keyword/byte
- 2 http://search.minakoe.jp/rsss/rsss.asp?pgsz=100&qry=java¬wit=1&twit=0&debug=1&multi=1
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=プロセス毎のswap&source=web&cd=1&ved=0CCAQFjAA&url=http://d.hatena.ne.jp/hsyd/20100527/1274972198&ei=OfUMT7LHNMfKmQXJtKWjBg&usg=AFQjCNGHns5cH1WXDKXgA2IBUzYg2hET
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=aspectj+weaving+tomcat&source=web&cd=5&ved=0CEkQFjAE&url=http://d.hatena.ne.jp/hsyd/20101110/1289409360&ei=yFUOT9OCGMqWmQWE96D8Aw&usg=AFQjCNHhyUnCM8C_ASdUzo4vzokuHuz5gA
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=mongodb java&source=web&cd=3&ved=0CEYQFjAC&url=http://d.hatena.ne.jp/hsyd/20110523/1306174018&ctbs=qdr:y&ei=s9AET6nTJa32mAX6oom2Ag&usg=AFQjCNFQI6JNCSgRDiqFjh4P49T2UkNyFw&sig2=zmRcp00YAxYTH2Drf3hsAg
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=restlet+GET+json+null&source=web&cd=1&ved=0CC4QFjAA&url=http://d.hatena.ne.jp/hsyd/20100926/1285524201&ei=mm0OT7bBBuP2mAWZounvAw&usg=AFQjCNFD_tsMCL4_d870LtPh6Nl-yOQWpg
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=restlet+request&source=web&cd=60&ved=0CGYQFjAJODI&url=http://d.hatena.ne.jp/hsyd/20100926/1285524201&ei=Or8PT5r9H4iUiAej7MGrAg&usg=AFQjCNFD_tsMCL4_d870LtPh6Nl-yOQWpg
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=swap プロセス&source=web&cd=2&ved=0CCcQFjAB&url=http://d.hatena.ne.jp/hsyd/20100524/1274680980&ei=3LALT9vpD8XCmQWRkZCEBg&usg=AFQjCNFKo4XxnXp5MhPPtksh2fUwmYF0kA
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=swap usage&source=web&cd=1&ved=0CDYQFjAA&url=http://d.hatena.ne.jp/hsyd/20100510/1273504668&ei=d2wFT-TvJKquiQfGmezGAQ&usg=AFQjCNG69z_VKxY6sm83rFhBfbXFeW1kig&sig2=LTqy8dzFxPqqThWb-eDgbg