2016-03-14 13 views
5

मान लें कि मेरे पास बाइट सरणी है - बाइट [] जो किसी प्रकार की धारावाहिक प्रोटोबफ ऑब्जेक्ट का प्रतिनिधित्व करती है। वहाँअज्ञात प्रकार के जावा प्रिंट प्रोटोबफ ऑब्जेक्ट

1: 123 
2: Jhon 
3: Doe 
4: 0 

की तरह उत्पादन के लिए यह मुद्रित करने के लिए किसी भी तरह से, कुछ कहाँ 1, पूर्णांक क्षेत्र है 2 और 3 तार कर रहे हैं और 4

boolen है TextFormat.print मुझे ठोस बिल्डर प्रदान करने की आवश्यकता है Protobuf ऑब्जेक्ट के, जो मुझे नहीं पता।

उत्तर

1

अगर हम इस धारणा है कि खेतों सभी आदिम प्रकार (यानी नहीं उप संदेशों) कर रहे हैं कर सकते हैं तो आप पाश करने में सक्षम बहुत बस सभी क्षेत्रों के माध्यम से होना चाहिए -

for(Entry<FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) 
{ 
    if(entry.getValue() != null) 
     System.out.println(entry.getKey().getName() + ": " + entry.getValue().toString()); 
    else 
    System.out.println(entry.getKey().toString() + ": null"); 
} 

हालांकि, मैं बहुत हूँ सुनिश्चित करें कि Protobuf वस्तुओं ठीक से toString() विधि को लागू है, इसलिए मुझे लगता है कि आप बस Protobuf वस्तु के एक स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए

protoObj.toString() 

कॉल करने के लिए सक्षम होना चाहिए। अधिक जानकारी के लिए, पर एक नज़र डालें: https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/GeneratedMessage.ExtendableMessage#getAllFields%28%29

+0

मेरे पास उपरोक्त वर्णित संदेश वस्तु नहीं है। मेरे पास Google protobuf लाइब्रेरी का उपयोग करके बाइट सरणी – user12384512

+0

है, तो आप ऑब्जेक्ट को केवल बाइट सरणी के साथ बनाने में सक्षम होना चाहिए। जब पहले से ही ऐसा करने के लिए पुस्तकालय होते हैं तो इसे स्वयं क्यों पार्स करें? –

+0

यह मूल प्रश्न प्रोटोबफ लाइब्रेरी के उपयोग के बारे में नहीं था, यह अज्ञात प्रकार के संदेश को मुद्रित करने के बारे में था। – user12384512

4

की तरह एक प्रकार EmptyMessage परिभाषित करें:

message EmptyMessage { 
    // nothing 
} 

अब EmptyMessage के रूप में अपने संदेश को पार्स, फिर उस पर toString() कहते हैं।

यह क्यों काम करता है? खैर, मान लें कि यह संदेश प्रकार में फ़ील्ड जोड़ने के लिए पीछे की ओर संगत है। जब आप कोई फ़ील्ड जोड़ते हैं, तो उस फ़ील्ड का उपयोग पुराने प्रोग्राम में एक संदेश भेजें जो फ़ील्ड के ज्ञान के साथ नहीं बनाया गया था, फिर फ़ील्ड को "अज्ञात फ़ील्ड" के रूप में माना जाता है। अज्ञात फ़ील्ड को संख्या/मान जोड़े के रूप में मुद्रित किया जाता है। अब, यदि आप EmptyMessage से शुरू करते हैं और फ़ील्ड जोड़ते हैं, तो आप स्पष्ट रूप से किसी भी अन्य संदेश प्राप्त कर सकते हैं। इसलिए, सभी संदेश प्रकार EmptyMessage के साथ "पिछड़ा-संगत" हैं। इसलिए, अज्ञात फ़ील्ड के रूप में सभी फ़ील्ड का इलाज करने के लिए EmptyMessage के रूप में किसी भी संदेश को पार्स किया जा सकता है।

+0

प्रोटोटा में खाली संदेश घोषित किए बिना इसे कैसे करना है? मेरा मतलब रनटाइम पर गतिशील रूप से है? – user12384512

+0

@ user12384512 क्षमा करें, मुझे समझ में नहीं आता है। वही 'खाली संदेश' सभी प्रकार के लिए काम करेगा, तो आपको इसे "रनटाइम पर गतिशील" परिभाषित करने की आवश्यकता क्यों होगी? आप इस सुविधा के लिए अन्य कोड लिख रहे हैं, उसी समय आप 'खाली संदेश' को परिभाषित क्यों नहीं कर सकते? उस ने कहा, यदि आप वास्तव में इसे "रनटाइम पर गतिशील" करने पर जोर देते हैं, तो आप 'डायनामिक मैसेज' का उपयोग कर सकते हैं - लेकिन यह और अधिक काम करेगा और इसका कोई फायदा नहीं होगा। –

+0

चेतावनी: यदि प्रोटोबफ एक संदेश का प्रतिनिधित्व करता है जिसमें उप-संदेश होता है, तो उप-संदेश को बाइट सरणी के रूप में स्ट्रिंग किया जाएगा; दूसरे शब्दों में, उप-संदेश को रद्द नहीं किया जाएगा। – user100464

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