Protocol Buffers学习【Qt】

news/2024/4/29 21:19:38/文章来源:https://blog.csdn.net/hitzsf/article/details/127626496

文章目录

  • 参考
  • 前言
  • 开发环境
  • # 一、下载
    • 1. 打开网页
    • 2. 点击download
    • 3. 下载
  • 二、 编译
    • 1. 解压
    • 2. 用QC打开项目
    • 3. 编译并等待
    • 4. 打开 `extract_includes.bat`
    • 5. 新建lib文件夹
  • 三、使用
    • 1. 新建 lm.helloworld.proto
    • 2. Qt 新建 HelloProtobuf 子目录项目
    • 3. lib_protobuf 目录
    • 4. Writer 工程
    • 5. Reader 工程
  • 四、总结

参考

Protobuf通信协议详解:代码演示、详细原理介绍等 - 知乎 (zhihu.com)

Protocol Buffers | Google Developers

前言

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

看到有人说起protobuf这个数据交换的格式,和平台无关,和语言无关,性能还比较好,就想学习一下。想到就做,边做边记录。

开发环境

  • win10
  • Qt 5.15.2
  • msvc2019 x64

# 一、下载

1. 打开网页

https://developers.google.cn/protocol-buffers/

在这里插入图片描述

2. 点击download

在这里插入图片描述

在这里插入图片描述

3. 下载

在这里插入图片描述

二、 编译

1. 解压

目录结构如下

protobuf-3.21.9
├─benchmarks
├─build_defs
├─cmake
├─conformance
├─csharp
├─editors
├─examples
├─m4
├─objectivec
├─php
├─ruby
├─src
├─third_party
└─util

2. 用QC打开项目

在这里插入图片描述

3. 编译并等待

编译结果如下:

..\protobuf-3.21.9\build-cmake-Desktop_Qt_5_15_2_MSVC2019_64bit-Release
│  .ninja_deps
│  .ninja_log
│  build.ninja
│  CMakeCache.txt
│  cmake_install.cmake
│  CTestTestfile.cmake
│  extract_includes.bat			// <------------ 注意这个文件
│  gmock.lib
│  gmock_main.lib
│  libprotobuf-lite.lib
│  libprotobuf.lib
│  libprotoc.lib
│  lite-arena-test.exe
│  lite-arena-test.exe.manifest
│  lite-test.exe
│  lite-test.exe.manifest
│  protobuf-lite-test-common.lib
│  protobuf-lite.pc
│  protobuf-test-common.lib
│  protobuf.pc
│  protoc.exe
│  protoc.exe.manifest
│  qtcsettings.cmake
│  tests.exe
│  tests.exe.manifest
│  test_plugin.exe
│  test_plugin.exe.manifest
│  version.rc
│
├─.cmake
├─.qtc_clangd
├─cmake
├─CMakeFiles
└─Testing

4. 打开 extract_includes.bat

内容如下所示:

# 新建一批目录
mkdir include
mkdir include\google
mkdir include\google\protobuf
mkdir include\google\protobuf\compiler
......
# 复制头文件到对应目录最终
copy "E:\3rd\protobuf-3.21.9\..\src\google\protobuf\any.h" include\google\protobuf\any.h
copy "E:\3rd\protobuf-3.21.9\..\src\google\protobuf\any.pb.h" include\google\protobuf\any.pb.h
copy "E:\3rd\protobuf-3.21.9\..\src\google\protobuf\api.pb.h" include\google\protobuf\api.pb.h
.....

copy的路径对于我来说,有点问题,所以做相应修改,去掉中间的 \.. 目录:

copy "E:\3rd\protobuf-3.21.9\src\google\protobuf\api.pb.h" include\google\protobuf\api.pb.h

执行批处理文件后,最终结果会把相应的头文件复制到include目录下
在这里插入图片描述

5. 新建lib文件夹

再将编译好的lib文件,复制到这个目录,可以再细分为 debug 和 release 目录(此处略),最后将 include 和 该lib文件加复制到另外一个目录:lib_protobuf

..\lib_protobuf
│  protoc.exe       // 可以考虑将这个文件复制过来
├─include
│  └─google
│      └─protobuf
│          │  any.h
│          │  .........
│          ├─compiler
│          │  ├─cpp
│          │  ├─csharp
│          │  ├─java
│          │  ├─objectivec
│          │  ├─php
│          │  ├─python
│          │  └─ruby
│          ├─io
│          ├─stubs
│          └─util
└─libgmock.libgmock_main.liblibprotobuf-lite.liblibprotobuf.liblibprotoc.libprotobuf-lite-test-common.libprotobuf-test-common.lib

三、使用

protobuf的使用和qSoap的使用有点相似。

protobuf协议利用生成工具 protoc.exe 从 自定义的 .proto 的文件 生成相应语言(cpp,c#, java)的接口文件,然后加入工程进行编译即可。

命令格式:

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

1. 新建 lm.helloworld.proto

syntax = "proto3";
package lm;
message helloworld
{int32   id       = 1;string  greeting = 2;
}

利用 cmd 执行 protoc.exe --cpp_out=. lm.helloworld.proto 命令即可:

  • lm.helloworld.pb.h ---- 生成类的头文件
  • lm.helloworld.pb.cc ---- 生成类的实现文件

2. Qt 新建 HelloProtobuf 子目录项目

再建两个子项目分别为:Reader 和 Writer,再复制 lib_protobuf 的文件夹过来
整体目录如下:
在这里插入图片描述

3. lib_protobuf 目录

  • 将 自定义的proto文件和生成的类文件拷贝到lib_protobuf 目录下

  • 新建 protobuf.pri 文件

    win32: LIBS += -L$$PWD/lib/ -llibprotobufINCLUDEPATH += $$PWD/include \$$PWD
    DEPENDPATH += $$PWD/include# 下面这一段 可以不用
    #PRE_TARGETDEPS += $$PWD/lib/libprotobuf.lib
    #PRE_TARGETDEPS += $$PWD/gmock.lib
    #PRE_TARGETDEPS += $$PWD/libprotoc.lib
    #PRE_TARGETDEPS += $$PWD/gmock_main.lib
    #PRE_TARGETDEPS += $$PWD/libprotobuf.lib
    #PRE_TARGETDEPS += $$PWD/libprotobuf-lite.lib
    #PRE_TARGETDEPS += $$PWD/protobuf-test-common.lib
    #PRE_TARGETDEPS += $$PWD/protobuf-lite-test-common.libHEADERS += \$$PWD/ProtobufTool.h \    // 后加的文件$$PWD/lm.helloworld.pb.h	// protobuf 生成的头文件SOURCES += \$$PWD/lm.helloworld.pb.cc // protobuf 生成的实现文件DISTFILES += \$$PWD/lm.helloworld.proto \   // .proto 相当于原型文件, 加到项目中看得比较清楚$$PWD/protoc.bat              // 就是一句:protoc.exe --cpp_out=. lm.helloworld.proto,方便操作
    
  • ProtobufTool.h

    唯一的功能是序列化成 QByteArray

    #ifndef PROTOBUFTOOL_H
    #define PROTOBUFTOOL_H
    //#include <google/protobuf/io/coded_stream.h>
    //#include <google/protobuf/arena.h>
    //#include <google/protobuf/arenastring.h>
    //#include <google/protobuf/generated_message_util.h>
    //#include <google/protobuf/metadata_lite.h>
    //#include <google/protobuf/generated_message_reflection.h>
    //#include <google/protobuf/repeated_field.h>  // IWYU pragma: export
    //#include <google/protobuf/extension_set.h>   // IWYU pragma: export
    //#include <google/protobuf/unknown_field_set.h>
    #include <google/protobuf/message.h>
    #include <google/protobuf/port_def.inc>
    #include <QByteArray>
    #include <QString>class ProtobufTool
    {
    public:static QByteArray SerializeToByteArray(PROTOBUF_NAMESPACE_ID::Message &msg){auto stdstring =  msg.SerializeAsString();return QByteArray::fromStdString (stdstring);}
    };#endif // PROTOBUFTOOL_H

4. Writer 工程

  • Writer.pro 文件

    CONFIG  -= app_bundle
    CONFIG  += c++17
    SOURCES += main.cpp
    include ($$PWD/../lib_protobuf/protobuf.pri)
    msvc : QMAKE_CXXFLAGS += /utf-8
    
  • main.cpp

    #include "ProtobufTool.h"
    #include "lm.helloworld.pb.h"
    #include <QDebug>
    #include <QFile>
    #include <QFileInfo>
    #define qout if( 1 ) qDebug() << __FILE__ << __LINE__ << ": "int main()
    {lm::helloworld msg1;msg1.set_id(1);msg1.set_greeting ("中国人民共和国!");auto ba = ProtobufTool::SerializeToByteArray(msg1);qout << ba;QFile file("../log");QFileInfo info(file);qout << info.absoluteFilePath ();if(file.open (QFile::WriteOnly)){file.write (ba);file.close ();}return 0;
    }
    

5. Reader 工程

  • Reader.pro 文件 两个工程文件是一样的

    CONFIG  -= app_bundle
    CONFIG  += c++17
    SOURCES += main.cpp
    include ($$PWD/../lib_protobuf/protobuf.pri)
    msvc : QMAKE_CXXFLAGS += /utf-8
    
  • main.cpp

    #include "lm.helloworld.pb.h"
    #include <QFile>
    #include <QDebug>
    #define qout if( 1 ) qDebug() << __FILE__ << __LINE__ << ": "int main(void ) {lm::helloworld msg;QByteArray ba;QFile file("../log");if(file.open (QFile::ReadOnly)) {ba = file.readAll ();file.close ();}msg.ParseFromArray (ba.constData (),ba.size ());qout << msg.id ();qout << QString::fromStdString (msg.greeting());return 0;
    }
  • 运行结果:

    ..\..\HelloProtobuf\Reader\main.cpp 19 :  1
    ..\..\HelloProtobuf\Reader\main.cpp 20 :  "中国人民共和国!"
    

四、总结

Protobuf 生成的对象流是二进制的,体积小巧,传输效率高。

开发效率没有json方便,如果不需要编译的程序,使用起来会更方便。

原来还想学习下protobuf的原型文件的语法来着,感觉在开发中不会用到protobuf,略吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410264.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云创建SVN支持多人协同办公

本文参考自&#xff1a; 如何在腾讯云轻量级服务器搭建svn_我的天才女友的博客-CSDN博客_腾讯云 svn 搭建SVN服务器-腾讯云 - 夜页子 - 博客园 一、配置要求 选择腾讯云CentOS的镜像进行安装 二、SVN服务端 1.SVN服务端的安装 yum install subversion 接下来输入y按回车继…

C语言练习---【求素数】(一篇带你掌握素数求解)

&#x1f996;作者&#xff1a;学写代码的恐龙 &#x1f996;博客主页&#xff1a;学写代码的恐龙博客主页 &#x1f996;专栏&#xff1a;【初级c语言】 &#x1f996;语录&#xff1a;❀未来的你&#xff0c;一定会感谢现在努力奋斗的自己❀ C语言练习---【求素数】&#x1…

数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(7)

文章目录前期准备1. 以df的列名创建一个DataFrame2. 打印所有换手率为非数字的行3. 删除所有换手率为非数字的行4. 重置df的行号5. 绘制‘还手’密度曲线6. 计算后一天和前一天收盘价的差值7. 计算后一天与前一天收盘价的变化率8. 设置时间索引9. 使用时间索引&#xff0c;分别…

JavaScript 49 JavaScript 作用域

JavaScript 文章目录JavaScript49 JavaScript 作用域49.1 JavaScript 函数作用域49.2 局部 JavaScript 变量49.3 全局 JavaScript 变量49.4 JavaScript 变量49.5 自动全局49.6 严格模式49.7 HTML 中的全局变量49.8 警告49.9 JavaScript 变量的有效期49.10 函数参数49 JavaScrip…

Mysql深度解析(一)索引底层数据结构与算法

MySQL底层索引是用B树实现的 传送门&#xff1a;什么是B-树、B树、B*树 传送门&#xff1a;深入理解MySQL索引底层数据结构与算法 传送门&#xff1a;MySQL中Innodb的索引 1 索引是什么? 索引&#xff1a;帮助Mysql高效获取数据的排好序的数据结构。 2 Mysql索引为什么用…

Sping的IoC容器和依赖注入

IoC Inversion of Control 使用对象时&#xff0c;由主动new产生对象转换为由外部提供对象&#xff0c;此过程中对象创建控制权由程序转移到外部&#xff0c;此思想称为控制反转 Spring实现了IoC的思想&#xff0c;Spring提供了一个容器&#xff0c;称为IoC容器&#xff0c;用…

【CSS】CSS选择器全解指南【CSS基础知识详解】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 &#x1f4c1;【CSS基础认知】 本文目录【CSS选择器全解指南】&#x1f319;CSS注…

SpringBoot 转发请求至指定页面

1、前言 原先的页面访问地址为&#xff1a;http://127.0.0.1:8888/office/schdule/index/&#xff0c; 重构项目&#xff0c;SpringBoot 项目&#xff0c;前后分离&#xff0c;前端文件放置静态目录&#xff08;static&#xff09;下&#xff0c;访问地址&#xff1a;http://12…

计算机毕业设计(附源码)python疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

URP下的OffScreen Particle Render

【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。随着越来越多的项目使用…

jsp个人评价管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 个人评价管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…

多模态自编码器从EEG信号预测fNIRS静息态

导读 本研究介绍了一种深度学习架构&#xff0c;用于评估40名癫痫患者的多模态脑电图(EEG)和功能性近红外光谱(fNIRS)记录。长短期记忆网络和卷积神经网络集成在一个多模态序列到序列的自编码器中。训练后的神经网络通过从EEG全谱和特定EEG频段中分层提取深度特征&#xff0c;…

fscan:一键自动化、全方位漏洞扫描的开源工具

https://blog.csdn.net/osfront/article/details/116049846 打开服务器看到了一个软件fscan64,并有运行页面。因为没见过,吓了我一跳,搜索了下是什么,记录下。 简介 fscan 是一个内网综合扫描工具,方便一键自动化、全方位漏洞扫描。 它支持主机存活探测、端口扫描、常见服务…

【Java数据结构】顺序表

我们不过是普通人&#xff0c;只不过在彼此眼中闪闪发光 目录 1.模拟实现顺序表 1.1 顺序的结构 1.2 顺序表的成员属性 1.3 顺序表的构造方法 1.4 顺序表的成员方法 1.4.1 扩容 1.4.2 打印顺序表 1.4.3 尾插 1.4.4 在指定位置插入 1.4.5 判断数组中是否有这个元素…

SSH婴幼儿产品销售系统电商购物系统(含源码+论文+答辩PPT等)

该项目采用技术JSP、strust2、Spring、Hibernate、Tomcat服务器、MySQL数据库 &#xff0c;项目含有源码、论文、配套开发软件、软件安装教程、项目发布教程 本系统结构如下&#xff1a; 1&#xff0c;游客访问 |–系统首页&#xff0c;查看所有的商品信息和相关的菜单信息 |–…

每日一记:笔记工具使用、计算机基础知识、编程语言认识

1、笔记工具的使用 我现在使用的是typora这个文档工具 markdown语法 常见操作有&#xff1a;标题、代码块、引用、列表等 typora工具的主页面 我们可以编辑内容 做笔记 。。。 标题分类&#xff1a; 和html&#xff08;超文本标记语言 前端部分一样&#xff09;分为六级标题…

拉卡拉第三季营收13.45亿:净利8372万 同比降73%

雷递网 雷建平 10月31日拉卡拉支付股份有限公司&#xff08;证券代码&#xff1a;300773&#xff0c;证券简称&#xff1a;拉卡拉&#xff09;日前发布财报&#xff0c;财报显示&#xff0c;拉卡拉2022年前三季营收43.55亿元&#xff0c;同比降11.83%&#xff1b;拉卡拉2022年前…

Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)

文章目录Shell字符串单引号双引号拼接字符串获取字符串长度提取子字符串查找子字符串Shell数组定义数组读取数组获取数组的长度Shell注释流程控制if判断case语句for 循环while 循环read 读取控制台输入Shell字符串 字符串是shell编程中最常用最有用的数据类型&#xff08;除了…

【DDR3 控制器设计】(5)DDR3 的仲裁读写操作设计

写在前面 本系列为 DDR3 控制器设计总结&#xff0c;此系列包含 DDR3 控制器相关设计&#xff1a;认识 MIG、初始化、读写操作、FIFO 接口等。通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等&#xff0c;附上汇总博客直达链接。 【DDR3 控制器设计】系列…