看了下Google Protobuf的源码,对于反射机制,无论c++实现还是java实现都是采用map查找,这个应很高效率。实际我们在项目中无形中也用 到了这种思路,仅仅没系统化。通过一个类的原型对象做辅助,然后配合map结构,就可很简单的根据符号名字来反射对象。从而实现一种抽象接口的稳定,把变 化隔离到了通讯协议 的数据内。
可参考http://blog.chinaunix.net/uid-52437-id-3142718.html文章。
原型 prototype pattern参考http://blog.chinaunix.net/uid-52437-id-2108601.html
wiki: http://en.wikipedia.org/wiki/Prototype_pattern
看一下从网络反射过程:
点击(此处)折叠或打开
- inline google::protobuf::Message* createMessage(const std::string& type_name)
- {
- google::protobuf::Message* message = NULL;
- const google::protobuf::Descriptor* descriptor =
- google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(type_name);
- if (descriptor)
- {
- const google::protobuf::Message* prototype =
- google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
- if (prototype)
- {
- message = prototype->New();
- }
- }
- return message;
- }
- //////////////以下是使用
- buf[numbytes] = '\0'; //buf为从网络收到的数据
- String data = buf;
- //"gamesrv.RepLuaMsg"为 类名字
- google::protobuf::Message* reply = createMessage("gamesrv.RepLuaMsg");
- //gamesrv::RepLuaMsg p2;
- reply->ParseFromString(data); //直接反序列化
下面是一个采用反射实现的简单客户端
点击(此处)折叠或打开
- // g++ -g `pkg-config --cflags protobuf` luaclient.cpp LuaCmd.pb.cc -o luacli `pkg-config --libs protobuf`
- #include <stdio.h>
- #include <unistd.h>
- #include <strings.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <string>
- #include <iostream>
- #include "LuaCmd.pb.h"
- #include <google/protobuf/descriptor.h>
- #include <google/protobuf/dynamic_message.h>
- #define HOST "localhost"
- #define PORT 8889
- #define MAXDATASIZE 100
- using namespace std;
- inline google::protobuf::Message* createMessage(const std::string& type_name)
- {
- google::protobuf::Message* message = NULL;
- const google::protobuf::Descriptor* descriptor =
- google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(type_name);
- if (descriptor)
- {
- const google::protobuf::Message* prototype =
- google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
- if (prototype)
- {
- message = prototype->New();
- }
- }
- return message;
- }
- int main(int argc, char ** argv)
- {
- int fd, numbytes;
- char buf[MAXDATASIZE];
- struct hostent *he;
- struct sockaddr_in server;
- if (argc != 2) {
- printf("Usage: %s \"COMMAND\"\n",argv[0]);
- exit(0);
- }
- he = gethostbyname("10.57.220.70");
- fd = socket(AF_INET, SOCK_STREAM, 0);
- bzero(&server, sizeof(server));
- server.sin_family = AF_INET;
- server.sin_port = htons(PORT);
- server.sin_addr = *((struct in_addr *)he->h_addr);
- int ret = connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr));
- //for send
- string data;
- int cmdid = 1000;
- char szTemp[1024]={'\0'};
- gamesrv::LuaMsg p;
- p.set_account("123");
- p.set_msg("hideto.bj@gmail.com");
- p.SerializeToString(&data);
- *(int*)(szTemp+4) = htonl(cmdid);
- int len = 4+4;
- memmove(szTemp+8,data.c_str(),data.length());
- len +=data.length();
- *(int*)(szTemp) = htonl(len);
- ret =send(fd, szTemp, len, 0);
- memset(buf,0,sizeof(buf));
- numbytes = recv(fd, buf, 8, 0);
- numbytes = ntohl(*(int*)(buf))-8;
- ret = recv(fd, buf, numbytes, 0);
- buf[numbytes] = '\0';
- data = buf;
- google::protobuf::Message* reply = createMessage("gamesrv.RepLuaMsg");
- reply->ParseFromString(data);
- gamesrv::RepLuaMsg* rep = (gamesrv::RepLuaMsg*)reply;
- cout << "People: " << endl;
- cout << "ID: " << rep->account() << endl;
- cout << "Email: " << rep->msg() << endl;
- string mm = rep->msg();
- close(fd);
- return 0;
- }
对应的proto文件LuaCmd.proto
点击(此处)折叠或打开
- package gamesrv;
- option java_package = "gamesrv.Request.protocol";
- option java_outer_classname = "LuaCmdProtos";
- message LuaMsg {
- required string account = 1; // Unique ID number for this person.
- optional string msg = 2;
- }
- message RepLuaMsg {
- required string account = 1; // Unique ID number for this person.
- optional string msg = 2;
- }
相关推荐
赠送jar包:activemq-protobuf-1.1.jar; 赠送原API文档:activemq-protobuf-1.1-javadoc.jar; 赠送源代码:activemq-protobuf-1.1-sources.jar; 包含翻译后的API文档:activemq-protobuf-1.1-javadoc-API文档-...
activemq-protobuf-1.1.jar;activemq-protobuf-1.1.jar
赠送jar包:grpc-protobuf-1.24.0.jar; 赠送原API文档:grpc-protobuf-1.24.0-javadoc.jar; 赠送源代码:grpc-protobuf-1.24.0-sources.jar; 赠送Maven依赖信息文件:grpc-protobuf-1.24.0.pom; 包含翻译后的API...
赠送jar包:grpc-protobuf-1.24.0.jar; 赠送原API文档:grpc-protobuf-1.24.0-javadoc.jar; 赠送源代码:grpc-protobuf-1.24.0-sources.jar; 赠送Maven依赖信息文件:grpc-protobuf-1.24.0.pom; 包含翻译后的API...
赠送jar包:activemq-protobuf-1.1.jar; 赠送原API文档:activemq-protobuf-1.1-javadoc.jar; 赠送源代码:activemq-protobuf-1.1-sources.jar; 包含翻译后的API文档:activemq-protobuf-1.1-javadoc-API文档-...
标签:activemq-protobuf-test-1.1.jar,activemq,protobuf,test,1.1,jar包下载,依赖包
赠送jar包:akka-protobuf_2.11-2.4.20.jar; 赠送原API文档:akka-protobuf_2.11-2.4.20-javadoc.jar; 赠送源代码:akka-protobuf_2.11-2.4.20-sources.jar; 赠送Maven依赖信息文件:akka-protobuf_2.11-2.4.20....
赠送jar包:akka-protobuf_2.11-2.4.20.jar; 赠送原API文档:akka-protobuf_2.11-2.4.20-javadoc.jar; 赠送源代码:akka-protobuf_2.11-2.4.20-sources.jar; 赠送Maven依赖信息文件:akka-protobuf_2.11-2.4.20....
本项目"js-protobuf-encode-decode-master.zip"提供了一个在线工具,专门用于处理JavaScript环境下的Protobuf编码和解码操作。 Protobuf是一种由Google开发的数据序列化协议,它定义了一种二进制数据格式,比JSON...
标签:activemq-protobuf-pom-1.0-source-release.zip,activemq,protobuf,pom,1.0,source,release.zip包下载,依赖包
标签:activemq-protobuf-pom-1.1-source-release.tar.gz,activemq,protobuf,pom,1.1,source,release.tar.gz包下载,依赖包
X-Protobuf-Schema: src/main/proto/tutorial/addressbook.proto < X-Protobuf-Message: tutorial.Person < Content-Type: application/x-protobuf ; charset=UTF-8 < Content-Length:
本文将深入探讨protobuf的核心概念,并重点解析google-protobuf.jar在实际应用中的作用。 protobuf是一种二进制数据表示方式,它的主要优点在于比XML等文本格式更节省存储空间和传输带宽,同时在序列化和反序列化...
《PyPI官网下载 | TypeScript-protobuf-0.3.tar.gz:探索TypeScript与protobuf的集成应用》 在软件开发领域,高效的数据交换和序列化是关键环节,而Protocol Buffers(protobuf)作为Google推出的一种数据序列化...
在这个开源项目中,"protobuf-master"目录很可能是包含了项目的主分支或主线代码。通常,这个目录会包含以下组件: 1. **.proto** 文件:这些是protobuf的接口定义文件,其中定义了消息类型、服务以及它们的字段。...
idea-plugin-protobuf 是 Intellij IDEA 的插件,用来实现对 Google Protocol Buffes 的支持。
google-protobuf-java-2.6.1.jar 使用github下载的源码生成的jar包。
开源项目-google-protobuf.zip,Release Protocol Buffers v3.0.0 路 google/protobuf 路 GitHub