从公司的项目源码中看到了这个东西,觉得挺好用的,特为大家总结。下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0。
一、Protobuf 概述
1. Protocol是什么?
Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。
2. 为什么要用Protocol?
- 平台无关,语言无关,可扩展;
- 提供了友好的动态库,使用简单;
- 解析速度快,比对应的XML快约20-100倍;
- 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。
3. 怎么安装Protocol?
源码下载地址:
https://github.com/google/protobuf
安装依赖的库:
autoconf automake libtool curl make g++ unzip
安装:
$ ./autogen.sh
$ ./configure
$ make
$ make check$ sudo make install
二、Protobuf 怎么用?
1. 编写proto文件
首先需要一个proto文件,其中定义了我们程序中需要处理的结构化数据:
// Filename: addressbook.proto
syntax="proto2";
package addressbook;
import "src/help.proto"; //举例用,编译时去掉
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person_info = 1;
}
2. 代码解释
// Filename: addressbook.proto 这一行是注释,语法类似于C++。
syntax="proto2"; 表明使用protobuf的编译器版本为v2,目前最新的版本为v3。
package addressbook; 声明了一个包名,用来防止不同的消息类型命名冲突,类似于 namespace 。
import "src/help.proto"; 导入了一个外部proto文件中的定义,类似于C++中的 include 。不过好像只能import当前目录及当前目录的子目录中的proto文件,比如import父目录中的文件时编译会报错(Import "../xxxx.proto" was not found or had errors.),使用绝对路径也不行,尚不清楚原因,官方文档说使用 -I=PATH 或者 --proto_path=PATH&nbs