2014-06-09 8 views
24

Ho scritto codice per serializzare oggetti su JSON e BSON. Secondo il mio output, il BSON prodotto è di dimensioni maggiori rispetto al JSON. È previsto?Quale è più leggero, JSON o BSON?

Dal mio codice per Bson.class (utilizzando Jackson e 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); 
} 

Dal mio 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() e toString() come sopra)

miei POJO a re Person.class e Address.class.

Nella mia classe principale:

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()); 

L'ouput:

Bson : 301, data : - 
Json : 285, data : [{"name":"Ali Bin Baba","birthd... 

La mia domanda:

  1. È che la produzione vera, o è il mio codice w rong?
  2. Qualche suggerimento da verificare/testare, per confrontare le dimensioni di BSON e JSON?
+2

Proverei a decodificare i dati generati. Immagino che BSon sia più veloce da decodificare, non più compatto. –

+3

Se si desidera un formato denso e si sta utilizzando Java, i buffer di protocollo vanno decisamente bene, sono molto più compatti di entrambi e sono molto più veloci anche se richiedono uno schema. –

risposta

37

Dal BSON FAQ:

BSON è stato progettato per essere efficiente nello spazio, ma in molti casi non è molto più efficiente di JSON. In alcuni casi BSON utilizza ancora più spazio rispetto a JSON. La ragione di questo è un altro degli obiettivi di progettazione BSON: la traversabilità . BSON aggiunge alcune informazioni "extra" ai documenti, come i prefissi di lunghezza , che lo rendono facile e veloce da attraversare.

BSON è inoltre progettato per essere veloce da codificare e decodificare. Ad esempio, gli interi vengono memorizzati come numeri interi a 32 (o 64) bit, quindi non è necessario eseguire l'analisi su da e verso il testo. Questo utilizza più spazio di JSON per i piccoli numeri interi , ma è molto più veloce da analizzare.

Per un campo stringa, il sovraccarico in JSON è di 6 byte: 4 virgolette, due punti e una virgola. In BSON è 7 - entry type byte, null terminator to field name, 4 byte string length, null terminator to value.

Per un campo intero, la lunghezza JSON dipende dalla dimensione del numero. "1" è solo un byte. "1000000" è 7 byte.In BSON entrambi di questi sarebbero un intero a 32 bit a 4 byte. La situazione con numeri in virgola mobile è simile.

BSON non è destinato ad essere più piccolo. È destinato ad essere più vicino alle strutture con cui i computer lavorano in modo nativo, in modo che possa essere lavorato con maggiore efficienza - questo è un significato di "luce".

Se non stai inseguendo livelli estremi di prestazioni (come gli sviluppatori di MongoDB che hanno progettato BSON), allora consiglierei di usare JSON - la leggibilità umana è un grande vantaggio per lo sviluppatore. Finché utilizzi una libreria come Jackson, la migrazione a BSON in un secondo momento non dovrebbe essere difficile, come puoi vedere dal modo quasi identico con le tue classi BSON e JSON.

Tenere presente che se la dimensione è un problema, sia JSON che BSON dovrebbero comprimere bene.

+1

Ottima analisi. –

7

La struttura "foo":"bar" consuma 11 byte in UTF-8 codificati JSON. In BSON consuma 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 

Ci sono molti casi in cui JSON sarà più compatto.