2016-08-15 5 views
0

Ich google protobuf Bibliothek Version 2.61 und will mit Erweiterungen verwenden,Protobuf C++ Erweiterungen verwenden

Ich habe folgende proto-Dateien:

package communication; 

message BaseMessage { 
    required uint64 server_id  = 1; 
    required string uuid   = 2; 
    required uint64 message_id = 3; 

    extensions 100 to max; 
} 

message GetIdentify { 

    extend BaseMessage { 
    optional GetIdentify message = 100; 
    } 

    required string hostname = 1; 
} 

Ich bin in der Lage, die Nachricht mit dem folgenden bauen Code:

communication::BaseMessage base_message; 
base_message.set_message_id(123456); 
base_message.set_server_id(112313123); 
base_message.set_uuid("asdaskdjasd213123123asd"); 
base_message.MutableExtension(communication::GetIdentify::message)->set_hostname("http://test123123123ing"); 

jedoch habe ich das Gegenteil Aktion möchte und mit unbekannter Erweiterung bekommen Nachricht tun und es zu analysieren und die Erweiterung ist und analysieren nach ihm zu finden.

Ich habe nanobb für mein c-Projekt und Python-Version verwendet. aber ich finde es sehr schwer, in C++ protobuf-code zu schreiben, weil ich nicht genügend Dokumentation und Codebeispiele finden kann.

Gibt es eine Möglichkeit, dies zu tun, ohne zusätzliche Variable des Typs der Erweiterung hinzuzufügen?

Auch was ist die eleganteste Art und Weise so in C++ zu tun

Antwort

0

Die Bibliothek Parse-Nachricht und alle Erweiterungen. Sie können das Vorhandensein der Erweiterung mithilfe der HasExtension-Methode überprüfen.

Java-Implementierung muss Erweiterungen im Parser vor dem Parsen registrieren. Aber in C++ wird alles automatisch erledigt. Bitte sehen Sie den folgenden Code. (Getestet habe ich es mit protobuf 2.5.0)

erstellen und Nachricht schreiben:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <communication/p.pb.h> 
using namespace std; 

int 
main(int, char **) 
{ 
    communication::BaseMessage base_message; 
    base_message.set_message_id(123456); 
    base_message.set_server_id(112313123); 
    base_message.set_uuid("asdaskdjasd213123123asd"); 
    base_message.MutableExtension(communication::GetIdentify::message)->set_hostname("http://test123123123ing"); 
    base_message.SerializeToOstream(&cout); 
    return 0; 
} 

Nachricht lesen, Test-Erweiterung und drucken:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <communication/p.pb.h> 
#include <google/protobuf/text_format.h> 
using namespace google::protobuf; 
using namespace std; 

int 
main(int, char **) 
{ 
    communication::BaseMessage base_message; 
    base_message.ParseFromIstream(&cin); 

    if (base_message.HasExtension(communication::GetIdentify::message)) { 
     const communication::GetIdentify &ii = base_message.GetExtension(communication::GetIdentify::message); 
     cout << "yes, msg has extension: " << ii.hostname() << endl << endl; 
    } else { 
     cout << "no, msg has no extension" << endl << endl; 
    } 

    string res; 
    TextFormat::PrintToString(base_message, &res); 

    cout << res << endl; 
    return 0; 
} 
+0

Ok danke, so durch einzige Option iterieren Sie jedes Mal auf alle Arten von Erweiterungen, bis ich die Erweiterung finde? – RythemOfTheDay

+0

Sie können auch das Aufzählungsfeld 'type' zur Basisnachricht hinzufügen und den Typ der tatsächlichen Nachricht angeben. –

Verwandte Themen