2012-07-20 13 views
7

यहाँ, उनके डॉक्स, यह अच्छी तरह से पर्याप्त नहीं बताते कि क्या मैं यह पता लगाने की कोशिश कर रहा हूँ कम से कम मेरे लिए है ..डायनामिक मैसेज क्लास में एक संदेश को कैसे पार्स करें और फिर फ़ील्ड के माध्यम से पुनरावृत्ति करें?

Senario:

मैं 5 आद्य फ़ाइलों है कि मैं के लिए protoc साथ उत्पन्न है सी ++। मेरे आवेदन को एक संदेश प्राप्त करने की आवश्यकता है और उसके बाद अपने मूल्यों और नामों तक पहुंचने के दौरान सभी क्षेत्रों के माध्यम से पुन: प्रयास करने में सक्षम होना चाहिए।

मैं क्या करना चाहता हूं वह डायनेमिक मैसेज क्लास में एक संदेश पार्स करें और फिर फ़ील्ड के माध्यम से पुनरावृत्ति करें। इस तरह मुझे यह नहीं पता कि यह वास्तव में कौन सा संदेश है और मैं उन्हें एक सामान्य तरीके से संभाल सकता हूं।

मुझे पता है कि संदेशों को उनके विशिष्ट प्रकार पर पार्स करके उन्हें संभालना संभव है, फिर उन्हें उनके संदेश बेस क्लास के रूप में व्यवहार करना, लेकिन मेरे आवेदन के लिए जो वांछनीय नहीं है।

ऐसा लगता है कि मैं क्या करना चाहता हूं "--descriptor_set_out" और गतिशील संदेश वर्ग के माध्यम से संभव होना चाहिए।

मैं क्या कोशिश की है (और के साथ विफल):

मैं अपने protos के साथ फ़ोल्डर में descriptor.proto चले गए और संकलन चरण में ओर के साथ इसे शामिल मेरी अन्य शामिल हैं। मैंने "my_descriptors.pb.ds" फ़ाइल को प्रिंट करने के लिए - descriptor_set_out ध्वज भी सेट किया है

मुझे नहीं पता कि वहां से आगे बढ़ना है।

Here's what i've referenced, although there isn't much... लंबी पोस्ट के लिए खेद है, और कुछ हद तक अस्पष्ट विषय नामकरण स्कीमा है।

इसके अलावा, यह स्पष्ट नहीं था, मुझे लगता है कि संदेश "अज्ञात" नहीं हैं। मुझे लगता है कि अभी भी प्रत्येक प्रोटो के लिए संबंधित शीर्षलेखों को शामिल करने की आवश्यकता होगी, इसलिए मेरा कोड 'अज्ञात' संदेश के बारे में जानता है।

+1

एक प्रश्न - आप ऐसा क्यों करना चाहते हैं? यदि आप संदेश विवरण के साथ संदेश विवरण (नाम और प्रकार - जो फ़ील्ड के नामों के माध्यम से पुन: सक्रिय करने में सक्षम होना आवश्यक है) को स्थानांतरित कर रहे हैं, तो आप मूल रूप से गैर-स्वयं-वर्णन के प्रदर्शन और आकार बोनस को रद्द कर रहे हैं संदेश (जो प्रोटोबफ है)। आप इसके लिए JSON का उपयोग कर सकते हैं। – DarkWanderer

+0

@ डार्कवांडर, मेरा उपयोग यह था कि मेरे पास दक्षता उद्देश्यों के लिए एक बाइनरी संदेश है जो कुछ पब उप प्रक्रियाओं के माध्यम से बहती है। मेरे पास एक और प्रक्रिया है जिसे मैं बैठना चाहता था और पब उप प्रक्रिया के माध्यम से बहने वाले सभी संदेशों में सुनना चाहता था। इसमें संदेशों को डीकोड करने के लिए सभी आवश्यक शीर्षलेख शामिल हो सकते हैं और फिर मैं उन्हें एक पठनीय KeyValue स्ट्रिंग में ऑडिट/डिबगिंग उद्देश्यों के लिए लॉग फ़ाइल में आउटपुट करना चाहता हूं। मैं जो भी नया संदेश प्रकार जोड़ता हूं, उसके लिए मैं एक डिकोडर/अनुवादक नहीं लिखना चाहता हूं। बाइट्स को सामान्य प्रकार और पुनरावृत्त क्षेत्रों को सामान्य रूप से डंप करना चाहते हैं। – bgura

उत्तर

0

संदेश रचना का उपयोग करने का सबसे आम तरीका है। कुछ की तरह:

message Foo {...} 
message Bar {...} 
message GenericMessage { 
    enum Type {FOO = 1, BAR = 2}; 
    optional Foo foo = 1; 
    optional Bar bar = 2; 
} 

अगर आप वाकई बिल्कुल या तो Foo या Bar में से एक प्रत्येक GenericMessage में मौजूद है कि बनाने के लिए, आप वांछित व्यवहार मिलता है। आप एक GenericMessage पढ़ते हैं और फिर इसे कई विशिष्ट संदेशों में से एक के रूप में संसाधित करते हैं।

प्रोटोकॉल को दोबारा करने के बारे में सोचें। तुम सब करने की जरूरत है क्षेत्रों पर पुनरावृति है, तो हो सकता है आप एक सरल कुंजी-मान मैप की तरह कुछ के साथ बेहतर होगा:

message ValueMessage { 
    required string key = 1; 
    optional int IntValue = 2; 
    optional string StringValue = 3; 
    optional bool BoolValue = 4; 
    ... 
} 
message GenericMessage{ 
    repeated ValueMessage = 1; 
} 

या शायद आप आप प्रोटोकॉल किसी अन्य तरीके से refactor कर सकते हैं।

0

चेतावनी: मेरा जवाब पूरी तरह से सही नहीं है मुझे संघर्षों के बारे में कुछ संकलन त्रुटियां आ रही हैं, जब मैं इसे ठीक करता हूं तो मैं संपादित कर दूंगा :)। लेकिन यह एक शुरुआती बिंदु

इस प्रश्न को पोस्ट करने के बाद से यह काफी समय हो सकता है, लेकिन मुझे प्रोटोकॉल बफर के साथ काम करने के लिए कुछ दिनों का सामना करना पड़ा।

सभी संदर्भ सबसे पहले गलत है आदेश है कि जोड़ा जाना चाहिए पर विकल्प है:

--descriptor_set_out=<Directory>

जहां Directory जहां descriptor.proto की अपनी संकलित संस्करण (या .proto संकलित किया गया है आपकी फ़ाइल का वर्णन करता है कि) स्थित है।

इसके बाद आपको अपने autodescriving .proto फ़ाइल में Descriptor.proto फ़ाइल का संदर्भ जोड़ना होगा।

message MyMessage 
{ 
    required google.protobuf.FileDescriptorSet proto_files = 1; 
    ... 
} 
+0

वह चरण जो यहां गायब है, वह डायनामिक मैसेज के रेस्क्रिप्टरप्रोटो संदर्भ से शादी करना है। यहां किसी भी उदाहरण के साथ https://developers.google.com/protocol-buffers/docs/techniques#self- डिस्क्रिप्शन पर इसकी चर्चा नहीं की गई है :( –

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

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