2014-06-09 20 views
24

Napisałem kod do serializacji obiektów do JSON i BSON. Według moich wyników produkowany BSON jest większy niż JSON. Czy to jest oczekiwane?Który z nich jest lżejszy, JSON lub BSON?

Z mojego kodu dla Bson.class (z użyciem Jackson i 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); 
} 

z mojego 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() i toString() jak wyżej)

moich POJOs ciągu ponownie Person.class i Address.class.

W moim główne klasy:

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

ouput:

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

Moje pytanie:

  1. Czy to wyjście prawdziwe, czy mój kod w rong?
  2. Jakąkolwiek sugestię, aby sprawdzić/przetestować, porównać rozmiary BSON i JSON?
+2

Chciałbym spróbować odkodować wygenerowane dane. Zakładam, że BSon jest szybszy do dekodowania, a nie bardziej zwarty. –

+3

Jeśli chcesz gęstego formatu i używasz Javy, zdecydowanie idź na bufory protokołów, są one o wiele bardziej kompaktowe niż jedno i są znacznie szybsze, chociaż wymagają schematu. –

Odpowiedz

37

Z BSON FAQ:

BSON ma być skuteczny w przestrzeni, ale w wielu przypadkach nie jest dużo bardziej wydajny niż JSON. W niektórych przypadkach BSON zużywa jeszcze więcej miejsca niż JSON . Powodem tego jest inny z celów projektowych BSON: przejezdność. BSON dodaje do dokumentów "dodatkowe" informacje, takie jak prefiksy o długości , które ułatwiają i przyspieszają przechodzenie.

BSON jest również zaprojektowany do szybkiego kodowania i dekodowania. Na przykład: liczby całkowite są przechowywane jako 32 (lub 64) bitowe liczby całkowite, więc nie trzeba ich analizować do i od tekstu. To wykorzystuje więcej miejsca niż JSON dla małych liczb całkowitych , ale jest znacznie szybsze do przeanalizowania.

Dla pola tekstowego narzut w JSON ma 6 bajtów - 4 cudzysłowy, dwukropek i przecinek. W BSON jest to 7-bajtowy typ wpisu, zerowy terminator do nazwy pola, długość 4-bajtowego łańcucha znaków, zerowy terminator do wartości.

Dla pola liczby całkowitej długość JSON zależy od wielkości liczby. "1" to tylko jeden bajt. "1000000" ma 7 bajtów.W BSON obie te wartości będą 4-bajtową 32-bitową liczbą całkowitą. Sytuacja z liczbami zmiennoprzecinkowymi jest podobna.

BSON nie ma być mniejszy. Ma być bliżej struktur, które komputery pracują natywnie, aby można było pracować z większą wydajnością - to jest jedno znaczenie "światła".

Jeśli nie gonisz za ekstremalnymi poziomami wydajności (jak programiści MongoDB, którzy zaprojektowali BSON), to radzę użyć JSON - czytelność dla człowieka jest wielką korzyścią dla programisty. Tak długo, jak korzystasz z biblioteki takiej jak Jackson, migracja do BSON później nie powinna być trudna - możesz zobaczyć, jak prawie identyczne są twoje własne klasy BSON i JSON.

Pamiętaj, że jeśli rozmiar jest problemem, zarówno JSON, jak i BSON powinny kompresować.

+1

Doskonała analiza. –

7

Właściwość "foo":"bar" pobiera 11 bajtów w kodowaniu UTF-8 JSON. W BSON zużywa 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 

Istnieje wiele przypadków, w których JSON będzie bardziej zwarty.