博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
protobuf学习
阅读量:6167 次
发布时间:2019-06-21

本文共 4406 字,大约阅读时间需要 14 分钟。

参考了这篇文章:

http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

 

开发环境在我的线下开发机器的

/home/work/data/code/protobuf_demo

 

用jumbo安装的protobuf,安装目录在/home/work/.jumbo/

安装命令

jumbo search protobufjumbo install protobuf

装好后,写一个proto文件,放在/home/work/data/code/protobuf_demo/src/proto/messageName.proto 

package lm;message helloworld{    required int32     id = 1;  // ID    required string    str = 2;  // str    optional int32     opt = 3;  //optional field}

用命令

protoc -I=proto --cpp_out=src proto/messageName.proto

然后在src里面,写writer.cc文件

#include "messageName.pb.h"#include 
#include
#include
#include
using namespace std;int main(void) { lm::helloworld msg; msg.set_id(101); msg.set_str("hello"); fstream output("./log", ios::out|ios::trunc|ios::binary); return 0;}

编译命令:

export LD_LIBRARY_PATH=/home/work/.jumbo/lib/:$LD_LIBRARY_PATH/opt/compiler/gcc-4.8.2/bin/g++ -o writer writer.cc messageName.pb.cc -L/home/work/.jumbo/lib/ -lprotobuf -I/home/work/.jumbo/include/

运行 ./writer之后,生成 ./log,内容:ehello

再写reader.cc文件:

#include "messageName.pb.h"#include 
#include
using namespace std;void dumpMsg(const lm::helloworld &msg) { cout << msg.id() << endl; cout << msg.str() << endl;}int main(int argc, char* argv[]) { lm::helloworld msg; { fstream input("./log", ios::in | ios::binary); if (!msg.ParseFromIstream(&input)) { cerr << "Failed to parse address book." << endl; return -1; } } dumpMsg(msg);}

编译命令(加上writer的)

export LD_LIBRARY_PATH=/home/work/.jumbo/lib/:$LD_LIBRARY_PATH/opt/compiler/gcc-4.8.2/bin/g++ -o writer writer.cc messageName.pb.cc -L/home/work/.jumbo/lib/ -lprotobuf -I/home/work/.jumbo/include//opt/compiler/gcc-4.8.2/bin/g++ -o reader reader.cc messageName.pb.cc -L/home/work/.jumbo/lib/ -lprotobuf -I/home/work/.jumbo/include/

然后运行reader,得到

101hello

 

 

又加了一个新的例子,通过管道来进行数据的传输和连接。

proto file:

message AMessage {        required int32 a = 1;        optional int32 b = 2;        optional string str = 3;}

生成头文件命令:

protoc -I=proto --cpp_out=src proto/amessage.proto# if no '-I=proto' added, .pb.h and .pb.cpp files will be added to src/proto, but in .pb.cpp the header file is proto/.pb.h, abnormal

producer.cc

#include
#include
#include
#include"amessage.pb.h"using namespace std;int main(int argc,const char* argv[]) { AMessage msg; if(argc < 2) { fprintf(stderr, "usage:amessage a [b] [str]\n"); return 1; } msg.set_a(atoi(argv[1])); if(argc > 2) { msg.set_b(atoi(argv[2])); } if(argc > 3) { msg.set_str(argv[3]); } if (!msg.SerializeToOstream(&cout)) { cerr << "Failed to write msg." << endl; return -1; } return 0;}

 

consumer.cc

#include
#include
#include
#include"amessage.pb.h"using namespace std;int main(int argc, const char* argv[]) { AMessage msg; if (!msg.ParseFromIstream(&cin)) { cerr << "Failed to parse address book." << endl; return -1; } cout << msg.a() << endl; cout << msg.b() << endl; cout << msg.str() << endl; return 0;}

 

编译命令:

export LD_LIBRARY_PATH=/home/work/.jumbo/lib/:$LD_LIBRARY_PATH/opt/compiler/gcc-4.8.2/bin/g++ -o producer producer.cc amessage.pb.cc -L/home/work/.jumbo/lib/ -lprotobuf -I/home/work/.jumbo/include//opt/compiler/gcc-4.8.2/bin/g++ -o consumer consumer.cc amessage.pb.cc -L/home/work/.jumbo/lib/ -lprotobuf -I/home/work/.jumbo/include/

 

通过管道测试:

[src]$ ./producer 2 3 str | ./consumer 23str[src]$ ./producer 2 3 abc | ./consumer 23abc[src]$ ./producer 2 3 | ./consumer 23[src]$ ./producer 2 | ./consumer 20[src]$ ./producer | ./consumer usage:amessage a [b] [str][libprotobuf ERROR google/protobuf/message_lite.cc:123] Can't parse message of type "AMessage" because it is missing required fields: aFailed to parse address book.

可以看出,对于optional的字段,接收方直接使用是可以的,会拿到默认值,int是0,str是空串。

 

(另外,测试的时候,发现在终端没有看到输出。但是管道却能够读入。原因找到是因为protobuf编码,如果只有几个数字,输出会非常小,增加了string后能看到有输出)比如:

[src]$ ./producer 2 3            [src]$ ./producer 2 3 aa[src]$ ./producer 2 3 abcdefghijkabcdefghijk[src]$

 

转载于:https://www.cnblogs.com/charlesblc/p/5910442.html

你可能感兴趣的文章
富士通仍执着SPARC架构芯片 将坚持推新
查看>>
易宪容:企业要利用大数据挖掘潜在需求
查看>>
微软声称Win10周年更新为Edge浏览器带来更好电池寿命
查看>>
混合云是企业IT的未来吗?
查看>>
LINE在日本取得成功 但全球化之路还很长
查看>>
红帽云套件新增QuickStart Cloud Installer,加快私有云部署
查看>>
MapXtreme 2005 学习心得 一些问题(八)
查看>>
流量精细化运营时代,营销SaaS之使命——流量掘金
查看>>
哥伦比亚大学牙科学院使用RFID系统,更好管理牙科器械
查看>>
雅虎同意出售核心资产
查看>>
Win10大丰收的节奏 微软收编iOS全部150万应用
查看>>
智慧城市要除“城市病” 中兴通讯开辟新增长极
查看>>
华平蝉联“视频会议十大卓越品牌”
查看>>
Opera已确认解散iOS开发团队
查看>>
DevOps:新的业务浪潮
查看>>
CERT:启用EMET的Windows 7比Windows 10更加安全
查看>>
LINE上市:一场迟到、勇敢又无奈的IPO
查看>>
OA选型:OA系统工作流是核心
查看>>
如何发现“利用DNS放大攻击”的服务器
查看>>
《Arduino开发实战指南:LabVIEW卷》——第2章 Arduino软件
查看>>