文章目录
1. protobuf简介
Protocol buffers(简称protobuf)是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议,与XML相比,Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次,便可以使用特别生成的源代码,轻松的使用不同的数据流完成对这些结构数据的读写操作。protobuf版本兼容性强,同时对平台的依赖度低,支持跨平台使用,是目前工程开发常用的协议之一。
图片转自:https://www.jianshu.com/p/2265f56805fa
2. 安装
安装教程在之前已经写过,想参考的朋友可以点击这里自动跳转.
3. 简单测试
创建文件夹test
,下述操作均在该文件夹路径下操作,现将最终的文件目录树放出来供大家参考,文件夹中文件会在接下来一步步生成:
查看目录树
tree -a
目录树如下:
.
├── log
├── main
├── person.pb.cc
├── person.pb.h
├── person.proto
├── read
├── read.cpp
├── write
└── write.cpp
0 directories, 9 files
3.1 编写协议
创建person.proto
文件(协议一定要以.proto
结尾),使用message
字段定义协议
message Person {
required string name = 1;
required int32 id = 2;
}
message的格式比较灵活,每一个message类型都有一个或多个带有唯一编号的字段,每一个字段有一个字段名和一个字段类型,字段类型可以是下述类型:
- int32(整形)等
- float(浮点型浮点型)等
- booleans(布尔类型)
- strings(字符串类型)
- raw bytes
- 还可以是其他的protocol buffer message类型
- 除此之外也单独指定每一个字段为optional fields(可选字段)、required fields(必须字段)、repeated fields(可重复字段)。
3.2 编译.proto文件
编译3.1中生成的person.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。
protoc -I=./ --cpp_out=./ ./person.proto
-I=
代表输入文件的地址,protocal编译器会在指定目录搜索要导入的文件。如果没有给出标志,编译器会搜索编译命令被调用的目录。--cpp_out=
代表编译C++版本的protobuf,以及输出编译后生成文件的位置./person.proto
代表需要编译地文件
编译后会自动在/test
文件夹中生成person.pb.cc
和person.pb.h
文件,person.pb.cc
文件是自动生成的c代码,person.pb.h
在使用的代码中需要当做头文件导入.
3.2 测试protobuf
3.2.1 本地写入
在/test
文件夹下创建write.cpp
,并将下述代码写入cpp文件中
#include<iostream>
#include<fstream>
#include "person.pb.h"
#include "stdio.h"
using namespace std;
int main()
{
Person person;
person.set_name("蓝翔");
person.set_id(1);
cout << "success" <<endl;
fstream output("./log",ios::out | ios::trunc | ios::binary); if (!person.SerializeToOstream(&output)){ cerr << "Failed to write msg."<<endl; }
}
3.2.3 编译测试写入
输入下述命令对文件进行编译
gcc person.pb.cc write.cpp -o write -lprotobuf -lpthread -lm -lstdc++
运行生成的write
文件
./write
运行之后会发现在本地会自动生成一个log
文件,双击打不开该文件,这个文件即为在本地保存的信息.
3.2.4 本地读取
在/test
文件夹下创建read.cpp
,并将下述代码写入cpp文件中
#include<iostream>
#include<fstream>
#include "person.pb.h"
#include "stdio.h"
using namespace std;
int main()
{
Person person;
fstream input("./log",ios::in | ios::binary); if(!person.ParseFromIstream(&input)){ cerr << "Failed to parse address book." << endl; return -1; }
cout<< person.name()<<endl;
cout<< person.id()<<endl;
}
3.2.3 编译read.cpp
文件
输入下述命令对文件进行编译
gcc person.pb.cc read.cpp -o read -lprotobuf -lpthread -lm -lstdc++
运行生成的read
文件
./read
这时候你会发现之前在write.cpp
中写入的信息被读取出来,至此测试完成.
结束语
本章简单的介绍了protobuf的使用方法,接下来会更深入的讲解protobuf的使用方法.