2010-11-23 14 views
14

मैं क्यूटी विकास में Google के प्रोटोकॉल बफर में डुबकी डालना चाहता हूं, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि उन्हें सर्वश्रेष्ठ कैसे शामिल किया जाए।क्यूटी + प्रोटोबफ, प्रकार?

आखिरकार, मैं QUdpSocket और QTcpSocket प्रोटोकॉल बफर का उपयोग करके भेजना चाहता हूं।

एक सॉकेट (QByteArray) पर डेटा भेजने के लिए प्रोटोकॉल बफर message के बीच जाने के लिए सबसे अच्छी विधि क्या है और फिर दूसरी ओर फिर से वापस? नीचे के रूप में आप ParseFromArray() उपयोग कर सकते हैं, उदाहरण के लिए,: एक QByteArray से

Person person; // a protobuf object 
person.set_id(123); 
person.set_name("Bob"); 
person.set_email("[email protected]"); 

std::ostringstream out; 
person.SerializeToOstream(&out); 
QByteArray byteArray(out.str().c_str()); 
sendSerializedPersonOverQTcpSocket(byteArray); 

वापस पढ़ना एक Protobuf वस्तु:

उत्तर

12

एक Protobuf वस्तु से एक QByteArray बनाना

QByteArray byteArray = readSerializedPersonFromQTcpSocket(); 
Person person; 
if (!person.ParseFromArray(byteArray, byteArray.size())) { 
    std::cerr << "Failed to parse person.pb." << std::endl; 
} 
+4

प्रति गलत नहीं है, लेकिन आपको मैसेग की पहचान करने के लिए किसी तरह की आवश्यकता है दूसरी तरफ ई। इसके अलावा आपको डेटा की लंबाई की पहचान करने की आवश्यकता है। Protobuf आंतरिक रूप से उन चीजों में से कोई भी नहीं करता है। साथ ही, स्ट्रीम आउटपुट संस्करण स्वरूपकों का सबसे धीमा है - वेक्टर/सरणी आउटपुट तेज़ होते हैं। –

+0

मैं 'SerializeToArray' विधि का उपयोग करने का प्रयास कर रहा हूं, लेकिन यह समझ नहीं सकता कि 'QByteArray' में रूपांतरण कैसे करें। क्या आप इसका उदाहरण दे सकते हैं? – Jay

+0

कृपया स्वरूपित कोड के लिए नीचे देखें - मुझे नहीं पता कि टिप्पणियों में कोड को कैसे प्रारूपित किया जाए। उसके लिए माफ़ करना। \ n \ n शून्य कन्वर्ट QByteArrayToUser (QByteArray और aByteArray) { com :: your :: name_space :: उपयोगकर्ता उपयोगकर्ता; if (! User.ParseFromArray (aByteArray.data(), aByteArray.size())) { // पार्स नहीं कर सके } else { // yayyyyy अगर (user.has_userid()) { // ... } } } – Viren

3

@James (कृपया ध्यान दें कि ParseFromArray() केवल libs के proto-buf-lite संस्करणों पर उपलब्ध है)।

std::ostringstream out; 
person.SerializeToOstream(&out); 
QByteArray byteArray(out.str().c_str()); 

आप भी लिख सकते हैं::

void convertQByteArrayToUser(QByteArray& aByteArray) 
{ 
    com::your::name_space::User user; 
    if(!user.ParseFromArray(aByteArray.data(), aByteArray.size())) 
    { 
     //could not parse 
    } 
    else { //yayyyyy    
     if(user.has_userid()) 
     { 
      //... 
     } 
    } 
} 
+0

डाउनवोट से अंतिम दृष्टिकोण सुझाव की अनुशंसा करता हूं: ** केवल libs ** के प्रोटो-बफ-लाइट संस्करण पर उपलब्ध है। मुझे यह समझने के लिए दो घंटे लग गए कि यह पूर्ण संस्करण में भी उपलब्ध है! [Google लाइट एपीआई डॉक्यूमेनेशन] को क्वोटेट करना (https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message_lite#classes-in-this-file): 'यह इंटरफ़ेस द्वारा कार्यान्वित किया गया है सभी प्रोटोकॉल संदेश वस्तुओं। गैर-लाइट संदेश अतिरिक्त रूप से संदेश इंटरफ़ेस को कार्यान्वित करते हैं, जो MessageLite' का उप-वर्ग है – SebNag

6
बजाय

QByteArray byteArray(person.SerializeAsString().c_str()); 

संपादित करें: दो ही परिणाम देता है, लेकिन मुझे यकीन है कि मौसम यह सही है नहीं कर रहा हूँ ऊपर।

QByteArray byteArray(QString::fromStdString(person.SerializeAsString())); 

EDIT2:: यह एक बेहतर काम करने लगता है ठीक है, अब मुझे पता है कि यह कैसे काम करता है: अगर देखते हैं क्रमबद्धता में \ 0 चार पहले दो तरीके गलत हैं - सब कुछ के बाद यह तो खो जाता है। यह सही करने के लिए एक लिख सकते हैं:

QByteArray byteArray(person.SerializeAsString().c_str(), person.ByteSize()); 
4

नीचे कोड का उपयोग वास्तव में खतरनाक है

std::ostringstream out; 
person.SerializeToOstream(&out); 
QByteArray byteArray(out.str().c_str()); 
sendSerializedPersonOverQTcpSocket(byteArray); 

आप एक अच्छा विवरण यहाँ In protobuf-c, can optional uint32 variable have value 0

एक सही तरीके से एक Protobuf से एक QByteArray बनाने के लिए मिल सकता है संदेश

QByteArray byteArray; 
byteArray.resize(message.ByteSize()); 
message.SerializeToArray(byteArray.data(), byteArray.size()); 
संबंधित मुद्दे