オブジェクトをJSONとBSONにシリアル化するコードを作成しました。私の出力によると、生成されたBSONはJSONよりもサイズが大きくなっています。これは予想されますか?
_Bson.class
_の私のコードから(Jacksonとbson4jacksonを使用)
_private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private BsonFactory fac = new BsonFactory();
private ObjectMapper mapper = new ObjectMapper(fac);
public Bson(Object obj) throws JsonGenerationException,
JsonMappingException, IOException {
mapper.writeValue(baos, obj);
}
public int size() {
return baos.size();
}
public String toString() {
byte[] bytes = baos.toByteArray();
return new String(bytes);
}
_
私の_Json.class
_から
_private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private ObjectMapper mapper = new ObjectMapper();
public Json(Object obj) throws JsonGenerationException,
JsonMappingException, IOException {
mapper.writeValue(baos, obj);
}
_
(上記のsize()
およびtoString()
)
私のPOJOは_Person.class
_と_Address.class
_です。
私のメインクラス:
_ Address a = new Address("Jln Koli", "90121", "Vila", "Belgium");
Person p = new Person("ALi Bin Baba", new Date(), 90.0, 12, a);
List<Person> persons = new LinkedList<>();
persons.add(p);
persons.add(p);
Bson bson = new Bson(persons);
Json json = new Json(persons);
System.out.println("Bson : " + bson.size() + ", data : " + bson.toString());
System.out.println("Json : " + json.size() + ", data : " + json.toString());
_
出力:
_Bson : 301, data : -
Json : 285, data : [{"name":"ALi Bin Baba","birthd...
_
私の質問:
BSON FAQ から:
BSONは宇宙で効率的になるように設計されていますが、多くの場合、JSONよりもはるかに効率的ではありません。場合によっては、BSONはJSONよりもさらに多くのスペースを使用します。この理由は、BSONの設計目標のもう1つであるトラバース性です。 BSONは、長さのプレフィックスなどの「追加の」情報をドキュメントに追加して、簡単かつ迅速にトラバースできるようにします。
BSONは、エンコードとデコードが高速になるようにも設計されています。たとえば、整数は32(または64)ビット整数として格納されるため、テキストとの間で解析する必要はありません。これは、小さい整数に対してJSONよりも多くのスペースを使用しますが、解析ははるかに高速です。
文字列フィールドの場合、JSONのオーバーヘッドは6バイトです。4つの引用符、コロン、およびコンマです。 BSONでは、7-エントリタイプのバイト、フィールド名へのヌルターミネータ、4バイトの文字列長、値へのヌルターミネータです。
整数フィールドの場合、JSONの長さは数値のサイズによって異なります。 「1」は1バイトです。 「1000000」は7バイトです。 BSONでは、これらは両方とも4バイトの32ビット整数になります。浮動小数点数の状況も同様です。
BSONは小さくすることを意図していません。これは、コンピューターがネイティブに動作する構造に近づけて、より効率的に動作できるようにすることを目的としています。これは、「光」の1つの意味です。
(BSONを設計したMongoDB開発者のように)極端なレベルのパフォーマンスを追求していない場合は、JSONを使用することをお勧めします。人間が読みやすいことは開発者にとって大きなメリットです。 Jacksonのようなライブラリを使用している限り、後でBSONに移行するのは難しいことではありません。これは、独自のBSONクラスとJSONクラスがほぼ同じであることがわかります。
サイズが問題になる場合は、JSONとBSONの両方が適切に圧縮される必要があることに注意してください。
プロパティ"foo":"bar"
はUTF-8でエンコードされた11バイトを消費します [〜#〜] json [〜#〜] 。 [〜#〜] bson [〜#〜] では13を消費します:
bytes description
============================================
1 entry type value \x02
3 "foo"
1 NUL \x00
4 int32 string length (4 -- includes the NUL)
3 "bar"
1 NUL \x00
JSONがよりコンパクトになる場合が多くあります。