2014-06-09 3 views
24

개체를 JSON 및 BSON으로 serialize하는 코드를 작성했습니다. 내 산출에 따르면 JSON보다 BSON의 크기가 더 큽니다. 예상 되나요? 내 Json.class가벼운 JSON 또는 BSON은 어느 것입니까?

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를 A로부터

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

(잭슨과 bson4jackson 사용) Bson.class에 대한

내 코드에서

다시 Person.classAddress.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()); 

OUPUT :

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

내 질문 :

  1. 가 출력하는 사실인가, 또는 내 코드입니다 w rong?
  2. BSON과 JSON의 크기를 비교/확인하기위한 제안 사항이 있습니까?
+2

생성 된 데이터의 디코딩을 시도합니다. BSon은 디코딩이 더 빠르며 더 컴팩트하지는 않습니다. –

+3

밀도가 높은 형식을 원하고 Java를 사용하는 경우에는 프로토콜 버퍼를 사용해야하며 크기가 훨씬 더 작고 스키마가 필요하지만 훨씬 빠릅니다. –

답변

37

은 :

BSON이 공간에서 효율적으로 설계하지만, 많은 경우에 훨씬 더 효율적 JSON 이상이다. 경우에 따라 BSON은 JSON보다 더 많은 공간을 사용합니다 ( ). 그 이유는 BSON 디자인 목표 중 하나입니다 : 트래버스 가능성. BSON은 길이가 접두사 인 과 같이 문서에 "추가 정보"를 추가하여 트래버스하기가 쉽고 빠릅니다.

또한 BSON은 인코딩 및 디코딩 속도가 빠르도록 설계되었습니다. 예를 들어, 정수는 32 (또는 64) 비트 정수로 저장되므로 텍스트와의 구문 분석은 일 필요가 없습니다. 이것은 작은 정수에서는 JSON보다 더 많은 공간을 사용하지만, 구문 분석하는 것이 훨씬 빠릅니다.

문자열 필드의 경우 JSON의 오버 헤드는 6 바이트 - 콜론과 쉼표로 구성됩니다. BSON에서 그것은 7 - 엔트리 타입 바이트, null 종결 자에서 필드 이름, 4 바이트 문자열 길이, null 종결자를 값으로 갖는다.

정수 필드의 경우 JSON 길이는 숫자의 크기에 따라 다릅니다. "1"은 단지 1 바이트입니다. "1000000"은 7 바이트입니다.BSON에서 이들 모두는 4 바이트 32 비트 정수입니다. 부동 소수점 숫자가있는 상황은 비슷합니다.

BSON은 더 작지 않습니다. 컴퓨터가 기본적으로 작동하는 구조에 더 가깝도록 설계되어 더 효율적으로 작업 할 수 있습니다. 즉 "빛"의 의미 중 하나입니다.

(BSON을 설계 한 MongoDB 개발자가 그렇듯이) 극한의 성능을 추구하지 않는다면 JSON을 사용하는 것이 좋습니다. 인간의 가독성은 개발자에게 큰 이점입니다. Jackson과 같은 라이브러리를 사용하는 한 나중에 BSON으로 마이그레이션하는 것은 어렵지 않습니다. 예를 들어, 자신의 BSON 및 JSON 클래스가 얼마나 동일한 지 알 수 있습니다.

크기가 문제가되면 JSON과 BSON 모두 잘 압축되어야 함을 명심하십시오.

+1

우수한 분석. –

7

속성 "foo":"bar"은 UTF-8로 인코딩 된 JSON에서 11 바이트를 소비합니다. BSON에서는 13 소비 :

JSON 더 컴팩트되는 많은 경우가 있습니다
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 

. BSON FAQ에서