ProtoBuf之启航

news2024/11/17 16:34:48

"How do we do we do go refarming~" 


如何理解序列化和反序列化?

 序列化: 把 对象 转换为 字节序列 的过程 称为对象的序列化。
 反序列化: 字节序列 恢复为 对象 的过程 称为对象的反序列化。

        这两对反义词从概念上来说并不难理解,但是为什么有事没事来一个序列化、反序列化的操作增加我们这些 "愚钝" 初学者的学习成本呢?序列化、反序列化的应用场景又是在哪里呢?

序列化反序列化场景:

存储数据:当你想把的内存中的 "对象状态" 保存到⼀个 "⽂件中或者存到数据库" 中时。
⽹络传输:⽹络直接传输数据,但是⽆法直接传输对象,所以要在"传输前序列化",传输完成后 “反序列化成对象”。

        很典型的序列化反序列化的模型,就存在于我们最初学习socket编程时,那一套htons() ntohs()、inet_addr() 、inet_ntoa()……这样做本质上无非强调的是一种格式、规范,降低通信成本和耦合性。

        当然还有其他实现序列化的远程数据传输交换格式:

        xml json 以及我们本节将要谈到的 protobuf。


一、ProtoBuf初始

(1)ProtoBuf是什么?

        protobuf是Google公司提出的一种轻便高效的结构化数据存储格式,常用于结构化数据的序列化,具有语⾔⽆关平台⽆关可扩展的序列化结构数据的⽅法,它⽤于(数据)通信协议、数据存储等。

语⾔⽆关、平台⽆关:即 ProtoBuf ⽀持 Java、C++、Python 等多种语⾔,⽀持多个平台。
⾼效:即⽐ XML 更⼩、更快、更为简单。
扩展性、兼容性好:你可以更新数据结构,⽽不影响和破坏原有的旧程序

        

(2)ProtoBuf的使用特点

 ①编写 .proto ⽂件,⽬的是为了定义结构对象(message)及属性内容。

 ②使⽤ protoc 编译器编译 .proto ⽂件,⽣成⼀系列接⼝代码,存放在新⽣成头⽂件和源⽂件中。

 ③依赖⽣成的接⼝,将编译⽣成的头⽂件包含进我们的代码中,实现对 .proto ⽂件中定义的字段进⾏设置和获取,和对 message 对象进⾏序列化和反序列化。

        总的来说:ProtoBuf 是需要依赖通过编译⽣成的头⽂件和源⽂件来使⽤的。有了这种代码⽣成机制,能够便于开发人员编写那些协议解析的代码了。

(3) Protobuf安装

Windos版:

①下载protobuf编译器:下载链接

        下载完成后,我们对zip进行解压,得到下面的文件。 

        下载之后将压缩包解压到本地⽬录下。解压后的⽂件内包含 bin、include⽂件,以及⼀个

readme.txt。bin文件内就是我们的protobuf编译器。
② 把protobuf添加到环境变量
        
        添加完成之后,我们可以使用cmd看看,检测是否可以使用。

        我们此时能够查到该文件,也就说明我们配置成功了。

Linux版:

下载 ProtoBuf依赖库:        

        下载 ProtoBuf 前⼀定要安装依赖库:autoconf automake libtool curl make g++ unzip
如未安装,安装命令如:
CentOS用户:
        sudo yum install autoconf automake libtool curl make gcc-c++ unzip

 

② 下载protobuf:

如果要在 C++ 下使⽤ ProtoBuf,可以选择cpp.zip ;
如果要在 JAVA 下使⽤ ProtoBuf,可以选择 java.zip;
其他语⾔选择对应的链接即可。
希望⽀持全部语⾔,选择 all.zip 。

        我们可以使用linux命名 wget + 该压缩包下载链接,完成资源的获取,进行unzip解压后得到以下的目录以及文件:

安装 ProtoBuf: 

第一步: ./autogen.sh 注:如果下载的具体语言 则不用使用 

第二步: ./configure  --> 这里的lib 与 bin是分开的

             ./configure -prefix=/usr/local/protobuf -> 这里的lib 与 bin是一起的。

第三步: make 

             make check 
             sudo make install 注:依次执行命令,过程会很耗时。

        我们再次在命令行输入 protoc --version,检测protobuf编译器的版本。 

         此时,我们也就完成了对protobuf的下载、安装。


本篇也就到此结束了,感谢你的阅读~

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xcode 14.3 和 iOS 16.4 为 SwiftUI 带来了哪些新的功能?

0. 概览 今年年初,Apple 推出了最新的 Xcode 14.3 以及对应的 iOS 16.4 。 与此同时,它们对目前最新的 SwiftUI 4.0 也添加了一些新功能: sheet 弹窗后部视图(Interact with a view Behind a sheet)可交互&#xff…

高级树结构

二叉排序树 左子树中所有结点的值,均小于其根结点的值。 右子树中所有结点的值,均大于其根结点的值。 二叉搜索树的子树也是二叉搜索树。 注意: 1.二叉查找树不能插入重复元素 2.中序遍历是一个递增的数列 3.高度越小查询效率越高 二叉排序…

RK3568平台开发系列讲解(驱动基础篇)RK 看门狗的使用

🚀返回专栏总目录 文章目录 一、简介二、DTS配置三、使用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK 看门狗的使用进行学习。 文章目录 一、简介二、DTS配置三、使用一、简介 看门狗(watchdog)是一个定时器,启动之后会开始计时。系统或者软件需要…

一个非常sb的报错……idea创建项目初始化失败……

今天在用idea创建项目时报错项目初始化失败; 一开始以为是配置原因,但后面尝试创建空项目都失败…… 觉得可能跟版本什么的无关,尝试重启、更新系统后,试着以管理员身份运行idea,问题解决了……………… 如果有报错信…

C语言——结构体初阶

哈喽,大家好,今天我们来学习C语言中的结构体,今天主要学习初阶结构体,后期我们将继续学习结构体进阶。 目录 1.结构体类型的声明 1.1 结构体的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. …

Cannot resolve plugin com.spotify:docker-maven-plugin:1.2.2 not found

问题 遇到这个错误是按照ruoyi-clou-plus把插件复制过来的,开始没有版本号,一直爆红,自己随便试了几个版本号,还是提示Cannot resolve plugin com.spotify:docker-maven-plugin not found 过程分析 百度了很多都说在settings.xml中加上 …

Tomcat安装与使用

Tomcat 是HTTP服务器,用于使用HTTP协议。 1、下载Tomcat 下载链接:https://tomcat.apache.org/ 进入官网后,根据自己想要下载的版本进行下载,我这里选择下载的版本是Tomcat 8. 点击选择自己想要下载的对应版本,下载Z…

基于Kruskal和Prim的最小生成树算法[matlab版本]

Kruskal算法 ------------------------------------ Kruskal算法为顺序取边的算法,复杂度与边的数量m有关, 为o(m log2 m).步骤如下: (1)初始化:最小生成树的边集A = ∅,对于图G中每个节点v ∈ V,生成 一个仅包含该节点的子树; (2)将图G中所有的边按照非降序方式排列; (…

YOLOv5、YOLOv7独家原创改进:独家首发最新EfficiCLNMS改进点,改进有效可以直接当做自己的原创改进点来写,新的增强预测帧

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5、YOLOv7改进:独家首发最新EfficiCL-NMS改进点,新的增强预测帧率。 💡对自己数据集改进有效的话,可以直接当做自己的原创改进点来写!!!改…

Trace32 SRST和TRST、system.attach 和 system.up的区别

目录 TRST-Resets the JTAG TAP controller and the CPU internal debug logic SRST- Resets the CPU core and peripherals SYStem.Mode Down SYStem.Mode Nodebug SYStem.Mode Prepare SYStem.Mode Go SYStem.Mode Attach SYStem.Mode StandBy SYStem.Mode Up 下图为…

HLS入门-LED闪烁仿真

什么是HLS HLS(High-Level Synthesis)是一种硬件描述语言编程技术,它可以将高级语言(如C/C)转换为硬件描述语言(如VHDL或Verilog),以便将其用于FPGA设计中。 HLS有什么核心技术&am…

《嵌入式系统开发实践》实验二 进程与线程

一、 实验目的 了解Linux中进程和线程的概念; 了解多线程程序的基本原理; 了解pthread库; 掌握用system、exec函数族、fork函数创建进程; 掌握使用pthread库中的函数编写多线程程序。 二、 实验任务与要求 应用fork函数创建子进…

行云流水| CI 3.0 云原生构建全新上线

研发过程中,如何直观且准确地获悉代码提交后的质量状态? 引入持续集成,可以自动化的对代码进行代码检查、单元测试、编译构建、甚至部署与发布,大幅提升开发人员的效率。 腾讯云 CODING 推出 CI 3.0 ——云原生构建,是…

LabVIEW:强大的图形化编程工具

LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是由美国国家仪器公司(National Instruments)开发的一种直观而强大的工程软件,被广泛应用于各个领域的工程师和科学家之中。 与传统的编程语言相比&…

打包后定义配置文件针对.vue和.js文件不同配置方法

条件:需要打包后形成config文件,在打包后改变此配置文件即可改变配置,如api地址,vue中方法参数和条件。 (1)首先config文件要在public文件中建立,webpack打包后config文件才会出现在打包的dist文…

SpringMVC第四阶段:Controller中如何接收请求参数

Controller中如何接收请求参数 1、原生API参数类型 1.1、HttpServletRequest类 只需要在Controller的目标方法中, 直接写上HttpServletRequest对象即可获取 原生API的 request对象实例。 RequestMapping(value "/p1") public String param1(HttpServletRequest …

( 动态规划) 1035. 不相交的线 ——【Leetcode每日一题】

❓1035. 不相交的线 难度:中等 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足: nums1[i] nums2[j]且绘制的直线不…

Postman如何做接口测试?你居然还不知道

目录 Postman如何做接口测试1:如何导入 swagger 接口文档 Postman如何做接口测试2:如何切换测试环境 Postman如何做接口测试3:什么?postman 还可以做压力测试? Postman如何做接口测试4:如何自动添加请求…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-自动变道-2

书接上回 2.3.4.3 系统主动变道 (1)变道需求输入 在NOA功能功能激活状态下,系统接收驾驶员请求或根据导航引导信息及道路环境信息获取变换车道的需求,包含导航引导路线的变道需求和智能避让变道需求。 导航引导变道需求 导航引导模式下的主动变道包括上高速由匝道并入主路、…

【前端知识】浅谈XSS和CSRF网络攻击

【前端知识】浅谈XSS和CSRF网络攻击 1. 常见的浏览器攻击2. XSS攻击2.1 定义2.2 类型2.2.1 Reflected XSS【反射型 - 非持久型 XSS】2.2.2 Stored XSS【存储型 - 持久型 XSS】2.2.3 DOM-based or local XSS【基于DOM或本地的XSS ,非持久性】2.2.4 其他类型XSS攻击 2…