Protocol Buffers的安装使用和C++/Python入门示例

2024-03-19 13:48

本文主要是介绍Protocol Buffers的安装使用和C++/Python入门示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 介绍

protoc buffers是google公司开发和开源的一款数据序列化和反序列化的工具。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。官方支持C++、java和pthon语言,并且有大量的第三方语言支持,如php,ruby等。

2. 编译安装

1 wget http://protobuf.googlecode.com/files/protobuf-2.3.0.tar.gz .
2 ./configure --prefix=/home/admin/work/protobuf-2.3.0/proto
3 make
4 make check
5 make install

我这里是用 –prefix 选项指定安装在/home/admin/work/protobuf-2.3.0/proto目录下, 如果不指定目录,将默认安装在/usr/local/下。

安装完成后在 /home/admin/work/protobuf-2.3.0/proto 下将生成三个文件夹bin,include和lib

将 /home/admin/work/protobuf-2.3.0/proto/bin 加到PATH里面,还有lib目录加在LD_LIBRARY_PATH里面方便点。

1 cat ~/.bashrc
2  
3 export PROTO_BUF=/home/admin/work/protobuf-2.3.0/proto
4 export PATH=$PROTO_BUF/bin:$PATH
5 export LD_LIBRARY_PATH=$PROTO_BUF/lib:$LD_LIBRARY_PATH

3. 编写.proto接口文件

参考网上的例子,写一个示例程序。该程序由两部分组成。第一部分被称为 Writer,第二部分叫做 Reader。Writer 负责将一些结构化的数据写入一个磁盘文件,Reader 则负责从该磁盘文件中读取结构化数据并打印到屏幕上。准备用于演示的结构化数据是 HelloWorld,它包含两个基本数据:

ID,为一个整数类型的数据

Str,这是一个字符串

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

其中,package 名字叫做 lm,定义了一个消息 helloworld,该消息有三个成员,类型为 int32 的 id,另一个为类型为 string 的成员 str。opt 是一个可选的成员,即消息中可以不包含该成员。

文件保存为 lm.helloworld.proto

4. 编译.proto文件

1 protoc -I=. --cpp_out=. lm.helloworld.proto

或者写完整路径:

1 /home/admin/work/protobuf-2.3.0/proto/bin/protoc -I=/home/admin/work/pbtest --cpp_out=/home/admin/work/pbtest /home/admin/work/pbtest/lm.helloworld.proto

5. 编写writer和reader程序

writer.cpp 将把一个结构化数据写入磁盘

1 #include "lm.helloworld.pb.h"
2 #include <iostream>
3 #include <fstream>
4  
5 using namespace std;
6  
7 int main(int argc, char* argv[]){
8     lm::helloworld msg1;
9     msg1.set_id(101);
10     msg1.set_str("hello");
11  
12     //write the new address book back to disk.
13     fstream output("./log", ios::out|ios::trunc|ios::binary);
14  
15     if(!msg1.SerializeToOstream(&amp;output)){
16         cerr << "Failed to write msg." << endl;
17         return -1;
18     }
19  
20     return 0;
21 }

reader.cpp 读取文件 log 中的序列化信息并打印到屏幕上

1 #include "lm.helloworld.pb.h"
2 #include <iostream>
3 #include <fstream>
4  
5 using namespace std;
6  
7 void ListMsg(lm::helloworld msg){
8     cout << msg.id() << endl;
9     cout << msg.str() << endl;
10 }
11  
12 int main(int argc, char* argv[]){
13     lm::helloworld msg1;
14  
15     fstream input("./log", ios::in|ios::binary);
16  
17     if(!msg1.ParseFromIstream(&amp;input)){
18         cerr << "Failed to parse msg." << endl;
19         return -1;
20     }
21  
22     ListMsg(msg1);
23  
24     return 0;
25 }

编译c++程序,注意要链接protobuf和pthread库。protobuf库文件在编译生成的lib目录下,需要export到LD_LIBRARY_PATH中。

1 g++ -g -o writer writer.cpp lm.helloworld.pb.cc -I. -I/home/admin/work/protobuf-2.3.0/proto/include  -L/home/admin/work/protobuf-2.3.0/proto/lib -lprotobuf -pthread
2 g++ -g -o reader reader.cpp lm.helloworld.pb.cc -I. -I/home/admin/work/protobuf-2.3.0/proto/include  -L/home/admin/work/protobuf-2.3.0/proto/lib -lprotobuf -pthread

编译成功生成 writer和reader两个二进制文件,执行:

1 [admin@search11 pbtest]$ ./write
2 [admin@search11 pbtest]$ ./reader
3 101
4 hello

发现当前目录下多了个 log 文件,查看内容如下:

1 [admin@search11 pbtest]$ ll
2 total 764
3 -rw-rw-r--  1 baoniu baoniu  12362 Aug 18 23:49  lm.helloworld.pb.cc
4 -rw-rw-r--  1 baoniu baoniu   6775 Aug 18 23:49  lm.helloworld.pb.h
5 -rw-rw-r--  1 baoniu baoniu    173 Aug 18 23:49  lm.helloworld.proto
6 -rw-rw-r--  1 baoniu baoniu      9 Aug 19 00:02  log
7 -rwxrwxr-x  1 baoniu baoniu 366455 Aug 18 23:14  reader
8 -rw-rw-r--  1 baoniu baoniu    450 Aug 18 23:14  reader.cpp
9 -rwxrwxr-x  1 baoniu baoniu 364021 Aug 18 23:58  write
10 -rw-rw-r--  1 baoniu baoniu    444 Aug 18 23:14  writer.cpp
11 [admin@search11 pbtest]$ hexdump -c log
12 0000000  b   e 022 005   h   e   l   l   o                           
13 0000009

通过这个例子展示了怎么通过protobuf来序列化和反序列化数据。

6. 参考文章:

《Google Protocol Buffer 的使用和原理》

《Protocol Buffers十分钟上手:入门示例》

另外:在protobuf解压后的examples目录已经有c++,java,python的示例,google网站上也有入门教程

这篇关于Protocol Buffers的安装使用和C++/Python入门示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826192

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4