protobuf动态解析

enum command

{

// 登录请求

CMD_LOGIN_REQ = 501 [(message_name) = "LoginReq"];

// 登录回复

CMD_LOGIN_RSP = 502 [(message_name) = "LoginRsp"];

}

extend google.protobuf.MessageOptions

{

// 协议的协议号

optional gateproto.command protocolid = 51550;

}

// CMD_LOGIN_REQ = 501

message LoginReq

{

option (gateproto.protocolid) = CMD_LOGIN_REQ;

required string account = 1;

required string name = 2;

required bytes token = 3;

required uint64 roleid = 4;

required uint32 is_reconnect = 5[ default = 0];

optional uint32 imgid = 6[ default = 0];

optional string device_id = 7;

}

include <stdio.h>

include <vector>

include <map>

include <iostream>

include "google/protobuf/message.h"

include "google/protobuf/descriptor.h"

include "google/protobuf/descriptor.pb.h"

include "google/protobuf/dynamic_message.h"

include "google/protobuf/compiler/importer.h"

include "google/protobuf/extension_set.h"

include <stdlib.h>

include <stdint.h>

include <ctype.h>

include "stable_test.h"

using namespace std;

using namespace google::protobuf;

using namespace google::protobuf::compiler;

using namespace google::protobuf::internal;

static DiskSourceTree srctree_;

static Importer *importer_;

static DynamicMessageFactory MsgFactory_;

struct MsgDesc

{

const FileDescriptor *filedesc;

const Descriptor *desc;

const Message *prototype;

};

std::map<string, MsgDesc *> descmap_;

std::vector< MsgDesc *> vecDesc_;

const FieldDescriptor * protocolid_des;

class FileErrorCollector : public MultiFileErrorCollector {

public:

void AddError(const string& filename, int line, int column,

const string& message)

{

cout << filename << endl;

cout << line << endl;

cout << column << endl;

cout << message << endl;

}

};

void AddSearchPath(vector<string>& paths)

{

for (size_t i = 0; i < paths.size(); i++)

{

srctree_.MapPath("", paths[i]);

}

FileErrorCollector err;

importer_ = new Importer(&srctree_, &err);

}

void AddMsgDesc(const string& proto_file)

{

const FileDescriptor *file_desc = importer_->Import(proto_file);

int count = file_desc->message_type_count();

if (count <= 0)

return;

int extensiopn_couny = file_desc->extension_count();

printf("extensiopn_couny type: %d\n", extensiopn_couny);

for (int i = 0; i < extensiopn_couny; i++)

{

const FieldDescriptor * msg_desc = file_desc->extension(i);

printf("extension type: %s\n", msg_desc->name().c_str());

printf("extension cpp type: %s\n", msg_desc->cpp_type_name());

printf("extension type: %s\n", msg_desc->type_name());

if ( msg_desc->name() == "protocolid")

{

protocolid_des = msg_desc;

}

}

// string key = proto_file.substr(0, proto_file.find_last_of("."));

for (int i = 0; i < count; i++)

{

const Descriptor * msg_desc = file_desc->message_type(i);

printf("message type: %s\n", msg_desc->name().c_str());

MsgDesc *msgdesc = new MsgDesc;

msgdesc->filedesc = file_desc;

msgdesc->desc = msg_desc;

msgdesc->prototype = MsgFactory_.GetPrototype(msg_desc);

descmap_[msg_desc->name()] = msgdesc;

printf("message type: %s\n", msg_desc->options().DebugString().c_str());

/*bool m = msg_desc->options().GetExtension(gateproto::protocolid);

if (m) {

printf("message type: %s\n", msg_desc->name().c_str());

vecDesc_.push_back(msgdesc);

}*/

}

}

void SendGsRandomMessage()

{

uint32_t index = 10;

auto iter = descmap_.find("EnterPvePassReq");

if (iter!= descmap_.end() ){

printf("SendGsRandomMessage");

MsgDesc *msgdesc = iter->second;

Message *msg = msgdesc->prototype->New();

printf("SendGsRandomMessage field count type: %d\n",msg->GetDescriptor()->field_count());

printf("SendGsRandomMessage extension count type: %d\n",msg->GetDescriptor()->extension_count());

printf("SendGsRandomMessage one count type: %d\n",msg->GetDescriptor()->oneof_decl_count());

printf("SendGsRandomMessage enum count type: %d\n",msg->GetDescriptor()->enum_type_count());

const Descriptor * option_Desc = msg->GetDescriptor()->options().GetDescriptor();

for (int i=0;i<option_Desc->field_count();i++) {

const FieldDescriptor * filed_des = option_Desc->field(i);

printf("FieldDescriptor type: %s\n", filed_des->name().c_str());

}

for (int i=0;i<msg->GetDescriptor()->field_count();i++) {

const FieldDescriptor * filed_des = msg->GetDescriptor()->field(i);

printf("FieldDescriptor type: %s\n", filed_des->name().c_str());

}

MessageOptions msgop= msg->GetDescriptor()->options();

const ::google::protobuf::UnknownFieldSet& unset = msgop.unknown_fields();

for (int i=0;i<unset.field_count();i++) {

UnknownField filed = unset.field(i);

printf("UnknownField %d",filed.varint());

}

}

}

int main(int argc, char *argv[])

{

vector<string> v;

v.push_back("../protocol");

v.push_back("../include");

AddSearchPath(v);

AddMsgDesc("gate.pb/gate.proto");

AddMsgDesc("rank.pb/rank.proto");

AddMsgDesc("immortaldb.pb/immortaldb.proto");

AddMsgDesc("dbproxy.pb/dbproxy.proto");

AddMsgDesc("online.pb/online.proto");

AddMsgDesc("login.pb/login.proto");

SendGsRandomMessage();

return 0;

}
</pre>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351