web-dev-qa-db-ja.com

JSONとBSONのどちらが軽いですか?

オブジェクトを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...
_

私の質問:

  1. その出力は本当ですか、それとも私のコードは間違っていますか?
  2. BSONとJSONのサイズを比較するために、チェック/テストするための提案はありますか?
31
Auf

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の両方が適切に圧縮される必要があることに注意してください。

50
slim

プロパティ"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がよりコンパクトになる場合が多くあります。

7
McDowell