如何使用谷歌的protocolBuffer(for C++)

C/C++编程:Protobuf 使用 概述 前言 在移动互联网时代,手机流量、电量时最为有限的资源,而移动端的即使通讯应用无疑必须的直面这两点 解决流量过大的基本方法是使用高度压缩的通信协议,而数据压缩后流量减少带来的自然结果也就是省电:因为大数据量传输必然需要更久的网络操作、、数据序列化及反序列化操作,这些都是电量消耗过快的根源。 当前即时通讯应用中最热门的通信协议无疑就是Google的Protobuf了,相比于它的前辈xml、json,它的体量更小,解析速度更快,所以在 IM 这种通信应用中,非常适合将 Protobuf 作为数据传输格式 阅读详情

简述

在上一篇 如何编译安装 protocolBuffer(for C++) 文章中讲述了如何编译,今天讲述一下如何使用,以及编译生成的一些选项以及额外的一些介绍。


1、新建.proto文件

下面我们先写一个简单的protobuf文件。

新建一个以.proto结尾的文件,如message.proto。然后添加一个Student结构。

syntax = "proto2";
option optimize_for = LITE_RUNTIME;

message LoginReqMessage {
  required int64 acctID = 1;
  required string passwd = 2;
}

2、编译.proto文件

我们编译安装完protocolBuffer之后,会生成下面几个文件夹,bin目录下面就是protocolBuffer编译器了。

这里写图片描述 这里写图片描述

下面使用protoc命令对我们定义的message.proto文件进行编译。(前提需要将protoc.exe添加到环境变量Path中)

// $SRC_DIR 表示.proto文件所在目录;
// cpp_out 表示当前用于C++语言;
// $DST_DIR 表示编译生成文件的路径;

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/message.proto

这里我将message.proto文件放到D盘的protobuf文件夹下,然后编译生成目录为D盘的protobufFiles文件夹,执行以下命令。然后我们在protobufFiles文件夹下看到生成了message.pb.h和message.pb.cc文件。

这里写图片描述

这里写图片描述

这里需要注意两点,上文中我们在.proto文件的头部添加了以下两行代码,到底什么意思的,下面给出具体的解释说明。

syntax = “proto2”;
option optimize_for = LITE_RUNTIME;

注意一 : syntax = “proto2”;

如果不加第一行,在编译的时候会报错,见下图。
这里写图片描述

报错的原因就是我们没有指定protobuf的版本,所以这里需要指定一下当前使用protobuf的版本,我们当前使用proto2,注意proto3与proto2有一定的区别,如果这里用了proto3,那么就会报错,因为proto3中去掉了一些复杂的语法和特性,相比 proto2 支持更多语言而且更简洁,比如上面我们用到的required 字段在proto3中已经去掉了,所以这里编译失败。(具体proto3与proto2的区别这里就不具体阐述,感兴趣的小伙伴可以移至百度一下)

这里写图片描述


注意二: option optimize_for = LITE_RUNTIME;

上面可以看到我们新建的.proto文件加了下面一句,这一行到底是什么意思,可以看一下官网的解释。

option optimize_for = LITE_RUNTIME;

optimize_for即编译生成代码优化选项,Protocol Buffer定义三种优化级别SPEED / CODE_SIZE / LITE_RUNTIME。默认情况下是 SPEED 。而且这里提到了只会影响C++、Java以及一些第三方的代码生成。

SPEED: 生成的代码经过了很好的优化,所以运行效率高,但是由此编译生成的.h和.cc文件会占用更多的空间。

CODE_SIZE: 和SPEED恰恰相反,虽然代码运行效率较低,但是由此编译生成的代码占用的空间更少,通常用于资源有限的平台,如开发手机app。

LITE_RUNTIME: 生成的代码执行效率高,同时编译生成的代码所占用的空间也是非常少。但是省去了Protocol Buffer提供的反射功能,也算是小小的牺牲。所以我们在C++中链接Protocol Buffer库时仅需链接libprotobuf-lite.lib(占用空间较小,仅几兆),而不是libprotobuf.lib(占用空间较大,一百多兆)。

同时如果我们选择了LITE_RUNTIME选项,那么生成的代码中所有的类均将继承自MessageLite,而非Message,具体我们可以到源码中看一下 Message 和 MessageLite 类的区别。

这里写图片描述

同时对于以上三种选项,我这里做了测试,虽然只相差了几k,因为我这里只定义了LoginReqMessage 一个结构,如果存在大量的结构,那么生成的文件所占用的空间还是有很大差距的。所以需要根据不同的情况进行选择。

SPEED
message.pb.h 10k
message.pb.cc 19k


CODE_SIZE
message.pb.h 9k
message.pb.cc 11k


LITE_RUNTIME
message.pb.h 9k
message.pb.cc 14k

这里我们也可以看一下不同选项下生成的message.pb.h小小的区别(更多不同可以用BCompare对比)。

SPEED 和 CODE_SIZE 选项都继承了 Message类。
这里写图片描述

LITE_RUNTIME选项继承了 MessageLite类。
这里写图片描述


3、开始使用 protobuf

1、准备工作

将上一篇文章中编译打包好的include文件夹以及lib文件夹拷贝到当前项目下的protocolBuf文件夹。
然后将上面编译生成好的 message.pb.h和message.pb.cc放到src文件夹下,

这里写图片描述

2、为工程项目进行配置

添加包含目录。

这里写图片描述

添加库目录。

这里写图片描述

添加库。

这里写图片描述

添加编译之后protobuf文件。

这里写图片描述

3、编写代码
{
    LogonReqMessage loginReq;
    // 这里提供set方法进行设置;
    loginReq.set_acctid(2017);
    loginReq.set_passwd("Pig_XXX");

    // 使用protobuf进行序列化;
    std::string strMessage;
    loginReq.SerializeToString(&strMessage);

    // 使用protobuf进行反序列化;
    LogonReqMessage loginReqTmp;
    loginReqTmp.ParseFromString(strMessage);

    // 获取结果;
    int id = loginReqTmp.acctid();
    std::string psw = loginReqTmp.passwd();

    qDebug() << "Account : " << id << "Password : " << QString::fromStdString(psw);

}

这里写图片描述

深入探索Protocol Buffer:谷歌的数据序列化框架 Protocol Buffer(简称Protobuf)是由Google开发的一种数据序列化协议,广泛应用于数据存储、通信协议等多个场景中。Protobuf的核心在于其使用一种.proto文件来定义数据结构,该文件是Protobuf中定义数据结构的基础。消息是.proto文件中的核心概念,每一个消息都定义了一个数据传输的格式。例如:在上述代码中,我们定义了一个名为Person的消息类型,它包含三个字段:nameid和email。 阅读详情

相关推荐

Protocol Buffer技术深入理解(C++实例)

C++实例Protocol Buffer技术详解,感兴趣的朋友可以了解下

protobuf-lite的使用C++ 及 windows 平台内存泄露解决方法

protobuf虽然很好,还有一个问题,NDK编译出的Lib SO 近20M,如果在android 上使用,明显不合适。造成包体积过大。 所以想到了 protobuf-lite,相对体积减小十倍; 相对 protobuf 也很简单,在生成文件里 *.proto文件修改,添加option optimize_for = LITE_RUNTIME; 可知成 protobuf-lite使用的类;...

q610098308的专栏 1万+

QT-使用ECharts显示地图,还有更多惊艳的图表等待你的使用

QT-使用ECharts显示地图前言一、使用步骤1.下载示例2. QT使用HTML文件配置3.使用HTML文件4. 数据交互及自适应总结注意:这个地图是百度的在线地图,需要百度API密钥和在联网的状态下使用。离线使用图表 前言 我上文QT图表chart-饼状图,使用qt自带的图表库charts来显示图表,实现数据可视化,但是QT自带的图表库显示效果并不佳,通俗说,就是不好看。 然而,有这么一个开源图表库,图表种类极多,并且效果良好,能够实现具有很好的视觉冲击的数据可视化。 它就是Apache ECharts

博咯的博客 4898

Protocol Buffers C++ 入门教程

ProtoBuf(Protocol Buffers )是中立于语言、平台,可扩展的用于序列化结构化数据的解决方案,由 Google 开发并开源。详情见Protocol Buffers 官网和Github 源码。简单地说,ProtoBuf 是用来对数据进行序列化和反序列化。那么什么是数据的序列化和反序列化呢?见下文。ProtoBuf 支持主流的开发语言,包括 Objective-C、C++、C#、Java、Python、Go、JavaNano、JavaScript、Ruby、PHP 等。

Doublelv 的博客专栏。 4万+

FPGA实现电机转速PID控制

通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。

STATEABC的博客 7517

UG NX 12.0零基础实战:从草图绘制到三维建模全流程解析

本文详细解析UG NX 12.0从草图绘制到三维建模的全流程,适合零基础用户快速掌握这款工业设计软件。内容涵盖界面设置、基础操作、草图技巧、拉伸旋转建模、布尔运算等核心功能,并通过机械零件实战案例演示完整设计流程,帮助读者系统学习UG NX 12.0的工业设计应用。

weixin_29261711的博客 1176

Protocol Buffer在MCU上的实现--C语言

一 什么是Protocol Buffer Protocol Buffer是一种支持多平台、多语言、可扩展的的数据序列化机制,相较于XML来说,protobuf更小更快更简单,支持自定义的数据结构,用protobuf编译器生成特定语言的源代码,目前protoBuf对主流的编程语言都提供了支持,非常方便的进行序列化和反序列化。 官方网址 官方支持的语言有: Java Python Objective-C C++ Dart Go Ruby C# 这里对Protocol Buffer的语法不做过多解释,这篇文章

ching的专栏 3762

基于stm32f407VGT6控制WS2812的TIM1+PWM+DMA实现方式

项目中使用到了ws2812灯带,作为产品的外观显示灯,经过开发之后,整理一下,仅供大家参考。 WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。 其外型与一个5050 LED灯珠相同, 每个元件即为一个像素点。 像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路, 还包含有高精度的内部振荡器和可编程定电流控制部分, 有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式, 像素点在上电复位以后, DIN端接受从控制器传输过来的数据, 首先送过来的24bit数据被第一个像素

weixin_43608153的博客 9214

ProtoBuf lite版中使用Any

protobuf

南宫封清的博客 1206

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

OpenCV安装配置教程VS2022(超级顺利)

博主最开始没打算写这篇博客,只是想简单的在网上找一下最新版的OpenCV的安装配置教程,适用于VS2022的,但是我搜了一早上,也没搜到一个能让我成功安装配置的,看了很多很多文章,根本就没有几篇有用的。所以没办法了,只能自己研究了,于是就整理了这篇博客,希望能帮到和我一样的人,这就是博主一直信奉的利他精神!

weixin_47367099的博客 5万+

【转】如何使用谷歌的protocolBuffer(for C++)

转个链接,备用 如何使用谷歌的protocolBuffer(for C++)  

zdleek的专栏 475

盲孔、埋孔、通孔、一阶HDI、二阶HDI概念

文章目录1. 盲孔和埋孔2. 一阶、二阶HDI3. PADS软件设置盲埋孔 1. 盲孔和埋孔 HDI板是高密度互连(High Density Interconnector)的缩写,是生产印制板的一种技术,使用微盲埋孔技术的一种线路分布密度比较高的电路板,也被称为盲埋孔板,下图就是一个6层HDI板,其中C和D就是盲孔,B是埋孔,A是通孔。 盲孔(Blind Via)指连接外层到内层的金属化孔,D是V13孔,连接顶层和第3层,C是V56孔,连接第5层和底层。 埋孔(Buried Via)指连接内层到内层的金属

记得诚 3万+

使用ProtocolBuffer实现网络协议二进制格式

1.综述 客户端与服务器交互时都需要双方协商,确定消息的二进制格式。客户端在向服务器发起请求时会根据协议创建二进制数据块,然后依托tcp, udp, http等协议将二进制内容传递给服务器,后者根据协议的规则按照特定次序从接收到的二进制内存块中读取给定字段。 这种做法存在一些问题。一是自定义的协议往往缺乏好的可扩展性,例如以后需要添加新字段,特别是字段要插入到以前字段的中间时,客户端和服务端协议解析代码得做相同修改。随着业务的发展,原先某些字段得删除时,协议解析代码又得修改,因此自定义协议解析在面对协议变化

tyler_download的专栏 1028

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

由于并没有开版权验证,而且闪退后也并没有弹框说版权问题,所以还是怀疑环境有什么地方不对。设置步骤,项目配置都没问题,Build也成功,Unity版本是符合要求的2022LTS版本,但是一在真机上运行就闪退。

每日出拳老爷子的博客 3176

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

AsyncSocketDemo,基于谷歌ProtocolBuffer协议的及时通讯

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RP...

JReno的博客 392

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

2-Protocol Buffer 基础(c++)

要创建地址簿应用程序,需要从.proto文件开始。proto文件中的定义很简单:为要序列化的每个数据结构添加消息,然后为消息中的每个字段指定名称和类型。下面是定义消息的.proto文件addressbook.proto。proto文件以包声明开始,这有助于防止不同项目之间的命名冲突。在c++中,生成的类将放在与包名匹配的命名空间中。接下来,您有您的消息定义。消息只是包含一组类型化字段的聚合。

搬砖人的自我修养 887

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Python进阶学习】gRPC的基本使用教程

【Python进阶学习】gRPC的基本使用教程前言快速上手gRPC了解protocol buffer语法使用使用工具生成对应语言的源代码搭建Python gRPC服务最佳实践gRPC的优势性能代码生成严格的规范流推荐使用gRPC的场景参考文献 前言 什么是RPC服务 RPC,是Remote Procedure Call的简称,翻译成中文就是远程过程调用。RPC就是允许程序调用另一个地址空间(通常是另一台机器上)的类方法或函数的一种服务。 它是一种架设在计算机网络之上并隐藏底层网络技术,可以像调用本地服务一样

dream_successor的专栏 6282

Protocol Buffer介绍

Protocol Buffer protocol buffer是谷歌公司开发的一个对结构化数据进行序列化和反序列化的协议.该协议采用了高效的编码方式,降低了序列化后的字节流数据的大小.同时谷歌也提供了多种语言的实现接口,例如C++,C#,Dart,Go,Java,Python … 等. 一些开发者也提供了自己的实现,补充了protobuf在其它语言中的使用,比如C等.总之,ProtocolBuffer已经能够很容易在多种语言之间作为数据交互的载体使用. 本文主要引用:https://developers.g

esuny的专栏 780

tensorflow学习(1):Protocol Buffer

博主在学习TensorFlow的起步阶段,一开始想用纸质的方式记录,但是鉴于纸质笔记搜索起来太慢,所以采用记录在博客的方式上。一来方便自己日后查找,二来也可以供大家浏览。如有错误之处,望各位海涵。 这里介绍TensorFlow的一个最主要的工具包:Protocol Buffer Protocol Buffer是谷歌开发的用于处理结构化数据的工具。结构化数据指的是拥有多种属性的数据,例如下面例子的用...

shanlepu6038的博客 1080

Ubuntu中配置TensorFlow使用环境

目录TensorFlow简介安装Anaconda获取Anaconda开始安装TensorFlow的两个主要依赖包Protocol Buffer TensorFlow简介 TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。 ...

peter19970118的博客 794

php brotobuf,还在用json?让ProtocolBuffer为你的数据瘦瘦身

前言protobuf是什么的?Protocol Buffer是一种用于序列化数据的协议。可以用来通信传输,数据传输等。可以用来取代json,xml等。为什么要用protobuf?解析速度快,生成的消息体积小,语法简洁明了,支持多种语言( C++、C#、Go、Java、Python、JavaScript等等)正如下图,protobuf会把数据的体积压缩到尽可能的小。图片来源:https://mart...

weixin_32827773的博客 188

grpc框架linux,谷歌开源了Kotlin版本gRPC

导读谷歌开源了 gRPC-Kotlin/JVM,让开发者可以在 Kotlin 项目中更方便地使用 gRPC,以更简单的方式构建可靠的网络连接服务。gRPC 是谷歌开源的高性能、通用 RPC 框架,支持多种编程语言,包括 C++、Java、Objective-C、Python、Ruby、Go、C# 与 Node.js 等。gRPC 基于 Protocol Buffers,它面向移动和基于 HTTP/...

weixin_42520909的博客 227

Socket Tcp C#

Socket Tcp CSharpSocket TCP C#版本,客户端以及服务端的简单封装,使用vs2015编写 - 1:客户端发送和接收。 - 2:服务端发送和接收。 - 3:发送和接收队列处理。 - 4:数据的分发,MsgCenter.cs,根据具体情况做参考。 - 5:Tcp粘包处理,本程序默认以数据前4位作为长度判断,请根据实际情况修 SocketClient 和 SocketS

Aslanchen的专栏 1532

类似于xml的一种数据传输格式protobuf

1、Protobuf 简介 Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:Java、C#、C++、Go和Python,Objective-C,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 XML 进行数据交换快许多。...

aijiekao4499的博客 363
上一篇: 如何编译安装 protocolBuffer(for C++)
下一篇: Qt之布局Layout的应用
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值