2010-03-30 12 views
23

announcement blog post पर एक टिप्पणी से:क्या JSON और प्रोटोकॉल बफ़र्स के बीच मानक मैपिंग है?

JSON के बारे में: JSON प्रोटोकॉल बफ़र की तरह ही संरचित है, लेकिन प्रोटोकॉल बफ़र द्विपदीय प्रारूप अभी भी छोटे और तेजी से सांकेतिक शब्दों में बदलना है। JSON , हालांकि प्रोटोकॉल बफ़र्स के लिए एक महान पाठ एन्कोडिंग बनाता है - यह एक एनकोडर/विकोडक कि करने के लिए और JSON से मनमाना प्रोटोकॉल संदेशों बदल देता है, Protobuf प्रतिबिंब का उपयोग कर लिखने के लिए तुच्छ है। AJAX ऐप्स, के साथ संवाद करने के लिए यह एक अच्छा तरीका है, जब उपयोगकर्ता प्रोटोबफ डिकोडर डाउनलोड करते हैं, जब वे आपके पृष्ठ पर जाते हैं तो बहुत अधिक हो सकता है।

यह एक मानचित्रण अप पकाने के लिए तुच्छ हो सकता है, लेकिन वहाँ दो कि किसी भी दो अलग-अलग देव टीमों स्वाभाविक रूप से तय होता है के बीच एक "स्पष्ट" मानचित्रण है? यदि दो उत्पादों ने पीबी डेटा का समर्थन किया है और वे इंटरऑपरेट कर सकते हैं क्योंकि उन्होंने वही .proto spec साझा किया है, तो मुझे आश्चर्य है कि अगर वे स्वतंत्र रूप से उसी नमूने के JSON प्रतिबिंब को पेश करते हैं तो वे अंतःक्रिया कर सकते हैं। कुछ मनमाने ढंग से निर्णय ले सकते हैं, उदाहरण के लिए क्या मूल्यों को एक स्ट्रिंग द्वारा प्रदर्शित किया जाना चाहिए (मानव-पठनीय ला ला सामान्य जेएसओएन) या उनके पूर्णांक मूल्य से?

तो क्या एक स्थापित मैपिंग है, और प्रोमो चश्मे से JSON एन्कोडर/डिकोडर्स उत्पन्न करने के लिए कोई ओपन सोर्स कार्यान्वयन है?

उत्तर

1

हाँ, के बाद से प्रोटोकॉल बफ़र संस्करण 3.0.0 (28 जुलाई, वर्ष 2016 को जारी) वहाँ "एक विकल्प के रूप में JSON में एक अच्छी तरह से परिभाषित एन्कोडिंग है द्विआधारी आद्य एन्कोडिंग करने के लिए " के रूप में रिलीज में बताया गया नोट

https://github.com/google/protobuf/releases/tag/v3.0.0

7

हो सकता है यह सहायक http://code.google.com/p/protobuf-java-format/

+0

कोई स्रोत-कोड [करता है] (https://code.google। कॉम/संग्रह/पी/प्रोटोबफ-जावा-प्रारूप/स्रोत/डिफ़ॉल्ट/काम करता है) 2011 से। एक मृत परियोजना? 2015 से – Raedwald

6

मैं क्या देखा है है, Protostuff परियोजना, जावा पर किसी भी पंजाब के काम के लिए उपयोग करने के लिए JSON के रूप में यह serializing, प्रोटोकॉल परिभाषा के आधार पर भी शामिल है। मैंने इसे स्वयं नहीं इस्तेमाल किया है, सिर्फ अच्छी बातें सुनी हैं।

+0

कोई नया [CHANGELOG] (https://github.com/protostuff/protostuff/blob/master/CHANGELOG.md) प्रविष्टियां। 5 महीने के लिए कोई भी बदलाव नहीं। एक moribund परियोजना? – Raedwald

1

एक और विचार: यदि प्रोटोबफ ऑब्जेक्ट्स गेटर्स/सेटर्स, या उचित नाम वाले फ़ील्ड हैं, तो कोई भी Jackson JSON प्रोसेसर के डेटा बाइंडिंग का उपयोग कर सकता है। डिफ़ॉल्ट रूप से यह सार्वजनिक गेटर्स, किसी भी सेटर्स और सार्वजनिक फ़ील्ड को संभालता है, लेकिन ये केवल डिफ़ॉल्ट दृश्यता स्तर हैं और इसे बदला जा सकता है। यदि ऐसा है, तो जैक्सन समस्याओं के बिना प्रोटोबफ उत्पन्न पीओजेओ को क्रमबद्ध/deserialize कर सकते हैं।

मैंने वास्तव में इस दृष्टिकोण को थ्रिफ्ट-जेनरेटेड ऑब्जेक्ट्स के साथ उपयोग किया है; केवल एक चीज जिसे मुझे कॉन्फ़िगर करना था, वह "isXXX()" विधियों के क्रमिकरण को अक्षम करना था जो थ्रिफ्ट को यह जांचने के लिए जोड़ता है कि कोई फ़ील्ड स्पष्ट रूप से असाइन किया गया है या नहीं।

+2

यह इतना आसान नहीं है: प्रोटोबफ विनिर्देशों से उत्पन्न जावा ऑब्जेक्ट्स केवल पढ़े जाते हैं, और नए उदाहरण बनाने के लिए बिल्डर क्लास का उपयोग करते हैं। – djjeck

+0

यह बदल सकता है, लेकिन उस दिन में जब मुझे लगता है कि गुण अंतिम नहीं थे और इस प्रकार प्रतिबिंब के माध्यम से बदला जा सकता है; यही कारण है कि जैक्सन नियमित रूप से जावा कोड नहीं कर सकता है, भले ही जैक्सन उन्हें संशोधित कर सके। – StaxMan

2

मुझे जनरेटेड मैसेजलाइट से जेएसओएन ऑब्जेक्ट में मार्शल की आवश्यकता थी लेकिन उसे अनारशल करने की आवश्यकता नहीं थी। मैं पेंजे के जवाब में प्रोटोबफ लाइब्रेरी का उपयोग नहीं कर सका क्योंकि यह LITE_RUNTIME विकल्प के साथ काम नहीं करता है। मैं मौजूदा प्रोटोकॉल बफर के लिए अधिक संकलित कोड उत्पन्न करने के साथ हमारी पहले से ही बड़ी विरासत प्रणाली को बोझ नहीं करना चाहता था। JSON के mashalling के लिए, मैं मार्शल करने के लिए सभी की

final Person gpb = Person.newBuilder().setName("Bill Monroe").build(); 
    final Gson gson = new Gson(); 
    final String jsonString = gson.toJson(gpb); 
0

सबसे पहले इस सरल समाधान के साथ चला गया मुझे लगता है कि एक protobuffs को एक डाटासेट परिवर्तित करने में एक प्रयास डाल पर बहुत सावधानी से कारण चाहिए। डेटा-सेट को प्रोटोबफ में बदलने के मेरे कारण यहां

  1. टाइप सुरक्षा: डेटा के प्रारूप पर विचार की जा रही है।
  2. डेटा की असम्पीडित स्मृति पैर-प्रिंट।कारण मैं अन-संपीड़ित का उल्लेख करता हूं क्योंकि पोस्ट संपीड़न JSON संपीड़ित और प्रोटो संकुचित के आकार में बहुत अंतर नहीं है लेकिन संपीड़न के साथ जुड़ी लागत है। इसके अलावा, serialization/de-serialization गति लगभग समान है, वास्तव में जैक्सन जेसन प्रोटोबफ से तेज है। अधिक जानकारी के लिए कृपया निम्नलिखित लिंक देखें http://technicalrex.com/2014/06/23/performance-playground-jackson-vs-protocol-buffers/
  3. प्रोटोबफ को नेटवर्क पर स्थानांतरित करने की आवश्यकता है।

कि कह रही है एक बार तुम कन्वर्ट अपने डेटा-सेट तरीका है कि ProtoBuff परिभाषा तो परिभाषित यह बहुत आसानी से सीधे Protostuff का उपयोग कर ProtoBuff प्रारूप करने के लिए मैप किया जा सकता है में जैक्सन JSON प्रारूप करने के लिए: JsonIoUtil: mergeFrom कार्य करते हैं। समारोह के हस्ताक्षर:

public static <T> void mergeFrom(JsonParser parser, T message, Schema<T> schema, boolean numeric) 

संदर्भ protostuff

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