protobuf入门教程1——gcc编译protobuf工程实现本地读写


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。

扫描二维码关注公众号,回复: 5445218 查看本文章
 protoc -I=./ --cpp_out=./ ./person.proto
  • -I=代表输入文件的地址,protocal编译器会在指定目录搜索要导入的文件。如果没有给出标志,编译器会搜索编译命令被调用的目录。
  • --cpp_out=代表编译C++版本的protobuf,以及输出编译后生成文件的位置
  • ./person.proto代表需要编译地文件

编译后会自动在/test文件夹中生成person.pb.ccperson.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的使用方法.

猜你喜欢

转载自blog.csdn.net/qq_16775293/article/details/87967312