2014-06-09 3 views
24

मैंने जेएसओएन और बीएसओएन को वस्तुओं को क्रमबद्ध करने के लिए कोड लिखा है। मेरे आउटपुट के अनुसार, जेएसओएन की तुलना में उत्पादित बीएसओएन आकार में अधिक है। क्या यह उम्मीद है?कौन सा हल्का, जेएसओएन या बीएसओएन है?

मेरे कोड से Bson.class

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 का प्रयोग करके) के लिए मेरे 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() के रूप में ऊपर)

मेरे POJOs एक से पुनः 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()); 

ouput:

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

मेरे प्रश्न:

  1. कि उत्पादन सच है, या मेरे कोड है w रोंग?
  2. बीएसओएन और जेएसओएन के आकार की तुलना करने के लिए जांच/परीक्षण करने के लिए कोई सुझाव?
+2

मैं उत्पन्न डेटा को डीकोड करने का प्रयास करूंगा। मुझे लगता है कि बीएसओएन डीकोड करने के लिए तेज़ है, अधिक कॉम्पैक्ट नहीं। –

+3

यदि आप घने प्रारूप चाहते हैं और जावा का उपयोग कर रहे हैं, तो निश्चित रूप से प्रोटोकॉल बफर के लिए जाएं, वे दोनों की तुलना में बहुत अधिक कॉम्पैक्ट हैं और बहुत तेज हैं हालांकि उन्हें स्कीमा की आवश्यकता है। –

उत्तर

37

BSON FAQ से:

BSON अंतरिक्ष में कुशल होने के लिए बनाया गया है, लेकिन कई मामलों में ज्यादा JSON से अधिक कुशल नहीं है। कुछ मामलों में बीएसओएन JSON की तुलना में और भी अधिक स्थान का उपयोग करता है। इसका कारण बीएसओएन डिजाइन लक्ष्यों में से एक है: ट्रैवर्सबिलिटी। बीएसओएन दस्तावेजों को कुछ "अतिरिक्त" जानकारी जोड़ता है, जैसे लंबाई उपसर्ग, जो इसे आसान और तेज़ करने के लिए तेज़ बनाता है।

बीएसओएन को एन्कोड और डीकोड करने के लिए तेज़ होने के लिए भी डिज़ाइन किया गया है। उदाहरण के लिए, पूर्णांक 32 (या 64) बिट पूर्णांक के रूप में संग्रहीत किए जाते हैं, इसलिए उन्हें को पाठ से और उसके लिए पार्स करने की आवश्यकता नहीं है। यह छोटे पूर्णांक के लिए JSON से अधिक स्थान का उपयोग करता है, लेकिन पार्स करने के लिए बहुत तेज़ है।

स्ट्रिंग फ़ील्ड के लिए, JSON में ओवरहेड 6 बाइट्स - 4 उद्धरण, एक कोलन और कॉमा है। बीएसओएन में यह 7 - एंट्री टाइप बाइट, फ़ील्ड नाम के लिए शून्य टर्मिनेटर, 4 बाइट स्ट्रिंग लम्बाई, शून्य टर्मिनेटर मूल्य के लिए है।

एक पूर्णांक फ़ील्ड के लिए, JSON लंबाई संख्या के आकार पर निर्भर करती है। "1" सिर्फ एक बाइट है। "1000000" 7 बाइट्स है।बीएसओएन में ये दोनों 4 बाइट 32 बिट पूर्णांक होंगे। फ्लोटिंग पॉइंट नंबरों की स्थिति समान है।

बीएसओएन छोटे होने का इरादा नहीं है। यह उन संरचनाओं के करीब होना है जो कंप्यूटर मूल रूप से काम करते हैं, ताकि इसे अधिक कुशलता से काम किया जा सके - यह "प्रकाश" का एक अर्थ है।

यदि आप प्रदर्शन के चरम स्तर का पीछा नहीं कर रहे हैं (जैसा कि बीएसओएन डिजाइन करने वाले मोंगोडीबी डेवलपर्स हैं), तो मैं जेएसओएन का उपयोग करने की सलाह दूंगा - मानव-पठनीयता डेवलपर के लिए एक बड़ा लाभ है। जब तक आप जैक्सन जैसी लाइब्रेरी का उपयोग करते हैं, तब तक बीएसओएन में माइग्रेट करना कठिन नहीं होना चाहिए - जैसा कि आप देख सकते हैं कि आपके बीएसओएन और जेएसओएन कक्षाएं लगभग कितनी ही समान हैं।

ध्यान रखें कि यदि आकार एक मुद्दा है, तो JSON और BSON दोनों को अच्छी तरह से संपीड़ित होना चाहिए।

+1

उत्कृष्ट विश्लेषण। –

7

संपत्ति "foo":"bar" यूटीएफ -8 एन्कोडेड JSON में 11 बाइट्स का उपभोग करती है। 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 अधिक कॉम्पैक्ट हो जाएगा रहे हैं।

संबंधित मुद्दे