google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。更详细的介绍见: Protocol Buffers

protobuf安装

1、下载protobuf代码 google/protobuf

2、安装protobuf

  tar -xvf protobuf

  cd protobuf

  ./configure --prefix=/usr/local/protobuf

  make

  make check

  make install

至此安装完成^_^,下面是配置:

(1) vim /etc/profile,添加

  export PATH=$PATH:/usr/local/protobuf/bin/

  export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/

  保存执行,source /etc/profile。同时在~/.profile中添加上面两行代码,否则会出现登录用户找不到protoc命令。

(2) 配置动态链接库

  vim /etc/ld.so.conf,在文件中添加/usr/local/protobuf/lib(注意: 在新行处添加),然后执行命令: ldconfig

.proto文件

  .proto文件是protobuf一个重要的文件,它定义了需要序列化数据的结构。使用protobuf的3个步骤是:

1 在.proto文件中定义消息格式

2 用protobuf编译器编译.proto文件

3 用C++/Java等对应的protobuf API来写或者读消息

程序示例(C++版)

  该程序示例的大致功能是,定义一个Persion结构体和存放Persion的AddressBook,然后一个写程序向一个文件写入该结构体信息,另一个程序从文件中读出该信息并打印到输出中。

1 addressbook.proto文件

package tutorial;message Persion {required string name = 1;required int32 age = 2;
}message AddressBook {repeated Persion persion = 1;
}

  编译.proto文件,执行命令: protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto,

示例中执行命令protoc --cpp_out=/tmp addressbook.proto ,会在/tmp中生成文件addressbook.pb.h和addressbook.pb.cc。

2 write.cpp文件,向文件中写入AddressBook信息,该文件是二进制的

 1 #include <iostream>2 #include <fstream>3 #include <string>4 #include "addressbook.pb.h"5 6 using namespace std;7 8 void PromptForAddress(tutorial::Persion *persion) {9     cout << "Enter persion name:" << endl;
10     string name;
11     cin >> name;
12     persion->set_name(name);
13
14     int age;
15     cin >> age;
16     persion->set_age(age);
17 }
18
19 int main(int argc, char **argv) {
20     //GOOGLE_PROTOBUF_VERIFY_VERSION;
21
22     if (argc != 2) {
23         cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;
24         return -1;
25     }
26
27     tutorial::AddressBook address_book;
28
29     {
30         fstream input(argv[1], ios::in | ios::binary);
31         if (!input) {
32             cout << argv[1] << ": File not found. Creating a new file." << endl;
33         }
34         else if (!address_book.ParseFromIstream(&input)) {
35             cerr << "Filed to parse address book." << endl;
36             return -1;
37         }
38     }
39
40     // Add an address
41     PromptForAddress(address_book.add_persion());
42
43     {
44         fstream output(argv[1], ios::out | ios::trunc | ios::binary);
45         if (!address_book.SerializeToOstream(&output)) {
46             cerr << "Failed to write address book." << endl;
47             return -1;
48         }
49     }
50
51     // Optional: Delete all global objects allocated by libprotobuf.
52     //google::protobuf::ShutdownProtobufLibrary();
53
54     return 0;
55 }

  编译write.cpp文件,g++ addressbook.pb.cc write.cpp -o write `pkg-config --cflags --libs protobuf` (注意,这里的`符号在键盘数字1键左边,也就是和~是同一个按键)。

3 read.cpp文件,从文件中读出AddressBook信息并打印

 1 #include <iostream>2 #include <fstream>3 #include <string>4 #include "addressbook.pb.h"5 6 using namespace std;7 8 void ListPeople(const tutorial::AddressBook& address_book) {9     for (int i = 0; i < address_book.persion_size(); i++) {
10         const tutorial::Persion& persion = address_book.persion(i);
11
12         cout << persion.name() << " " << persion.age() << endl;
13     }
14 }
15
16 int main(int argc, char **argv) {
17     //GOOGLE_PROTOBUF_VERIFY_VERSION;
18
19     if (argc != 2) {
20         cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;
21         return -1;
22     }
23
24     tutorial::AddressBook address_book;
25
26     {
27         fstream input(argv[1], ios::in | ios::binary);
28         if (!address_book.ParseFromIstream(&input)) {
29             cerr << "Filed to parse address book." << endl;
30             return -1;
31         }
32         input.close();
33     }
34
35     ListPeople(address_book);
36
37     // Optional: Delete all global objects allocated by libprotobuf.
38     //google::protobuf::ShutdownProtobufLibrary();
39
40     return 0;
41 }

  编译read.cpp文件,g++ addressbook.pb.cc read.cpp -o read `pkg-config --cflags --libs protobuf`

4 执行程序

[转]google protobuf安装与使用相关推荐

  1. google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  2. google protobuf Linux环境下的安装与使用

    google protobuf安装与使用 google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google prot ...

  3. 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

    http://blog.csdn.net/whuancai/article/details/11994341 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通 ...

  4. google ProtoBuf开发者指南

    目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 ...

  5. Google protobuf解析消息逻辑的版本问题

    在分析caffe2源码的过程中,由于caffe2使用protobuf作为网络结构和网络参数序列化和反序列化的机制,想在反序列化之前进行加解密处理,这是反向protouf其实有两个版本的实现来进行消息的 ...

  6. Protobuf 安装及 Python、C# 示例

    01| 简介02| 安装2.1 Windows 下安装03| 简单使用3.1 编译3.2 Python 示例3.3 C# 示例 01| 简介 Protobuf(Protocol Buffers),是 ...

  7. pythongoogle.probuf.timestamp_数据通信格式:Google Protobuf

    Protobuf是Google开发的序列化结构数据的一套工具,适合用于数据存储,以及不同语言不同应用之间进行通信的数据交换格式.目前Google提供了C++,Python,Java,Go等语言的支持. ...

  8. C++|Java工作笔记-google protobuf基本使用

    目录 前言 protoc生成 Java相关 C++相关 前言 这里主要是生成序列号,在我所做的项目中,一般是把数据序列化后扔到消息总线上,消费者读取了,自行解析. 个人感觉这种方式比Json和XML都 ...

  9. ubuntun 16.04 protobuf安装过程

    由于caffe的数据结构以及模型参数是采用的google protobuf在按照caffe之前需要首先安装protobuf 具体安装过程可以参考官网的github说的比较清楚 https://gith ...

最新文章

  1. 悟透javascript-笔记
  2. linux IP类常用命令
  3. Java入门算法(递归篇)丨蓄力计划
  4. IEnumerableT 接口主要成员
  5. Python20-Day03
  6. Datalogic得利捷推出物流应用领域全新标杆产品——AV900
  7. 使用最小二乘法拟合曲线
  8. 【PDF处理】java将全图片的pdf压缩,输出新的pdf
  9. 用qpython3写一个发送短信的程序
  10. C语言源码实现俄罗斯方块
  11. android字体加横线
  12. 攻防世界Misc高手进阶区第一页WriteUp
  13. 实数系的基本定理_继续学习贝叶斯定理
  14. 教你轻松学会用PYTHON给对象画圣诞树
  15. 【DBCA -SILENT】静默方式安装11gR2 oracle数据库软件
  16. 辽宁学考服务器位置,辽宁学考考点查询软件
  17. HBASE的CRUD操作
  18. Google Play应用上架流程 超详细!
  19. SAP学习笔记(MM的库存管理)
  20. 母猪的故事(c语言)

热门文章

  1. 做完四个小项目的收获
  2. DataBaseMetaData 从数据库中读取关于数据库属性
  3. 修改完/etc/fstab后重新挂载方法
  4. 3G或应尽早步入细分市场时代
  5. NET中class与struct的区别简析
  6. KGPolicy:用于推荐的负采样模型(知识图谱策略网络)WWW 2020
  7. BERT: Bidirectional Encoder Representations from Transformers双向Transformer用于语言模型 NAACL 2018
  8. dubbo学习之源码创建属于自己的dubbo-demo
  9. HTML5中拖动功能的添加属性,html5中可拖动dragable属性及其他成员的讲解
  10. 从搞科研到商业运作:Alberto Broggi 研究计算机视觉的二十年