[C++][ProtoBuf][初识ProtoBuf]详细讲解

news2024/12/29 3:49:18

目录

  • 1.序列化概念
  • 2.ProtoBuf是什么?
  • 3.ProtoBuf使用特点
  • 4.补充
    • 1.GOOGLE_PROTOBUF_VERIFY_VERSION 宏
    • 2.ShutdownProtobufLibrary()
    • 3.--decode
  • 5.序列化能力对比验证
  • 6.总结


1.序列化概念

  • 序列化:把对象转换为字节序列的过程,称为对象的序列化
  • 反序列化:把字节序列恢复为对象的过程 称为对象的反序列化
  • 什么情况需要序列化?
    • 存储数据:想把的内存中的对象状态保存到⼀个⽂件中或者存到数据库中时
    • 网络传输:⽹络直接传输数据,但是⽆法直接传输对象,所以要在传输前序列化,传输完成后反序列化成对象
  • 如何实现序列化?
    • XML、JSON、ProtoBuf

2.ProtoBuf是什么?

  • 语⾔⽆关、平台⽆关:⽀持Java、C++、Python等多种语⾔,⽀持多个平台
  • 高效:比XML更小、更快、更为简单
  • 扩展性、兼容性好:可以更新数据结构,⽽不影响和破坏原有的旧程序
  • 相对于XML 和JSON来说,因为被编码成⼆进制,破解成本增⼤,ProtoBuf编码是相对安全的

3.ProtoBuf使用特点

  • 使用步骤
    • 编写.proto⽂件,⽬的是为了定义结构对象(message)及属性内容
    • 使⽤protoc编译器编译.proto⽂件,⽣成⼀系列接⼝代码,存放在新⽣成头⽂件和源⽂件中
    • 依赖⽣成的接⼝,将编译⽣成的头⽂件包含进自己的代码中,实现对.proto⽂件中定义的字段进⾏设置和获取,和对message对象进⾏序列化和反序列化
  • 总结:ProtoBuf是需要依赖通过编译⽣成的头⽂件和源⽂件来使⽤的
    • 有了这种代码⽣成机制, 开发⼈员再也不⽤吭哧吭哧地编写那些协议解析的代码了

    • ⼲这种活是典型的吃⼒不讨好:P

      请添加图片描述


4.补充

1.GOOGLE_PROTOBUF_VERIFY_VERSION 宏

  • 验证没有意外链接到与编译的头⽂件不兼容的库版本
    • 如果检测到版本不匹配,程序将中⽌
  • 注意
    • 每个.pb.cc⽂件在启动时都会⾃动调⽤此宏
    • 在使⽤C++ Protocol Buffer库之前执⾏此宏是⼀种很好的做法,但不是绝对必要的

2.ShutdownProtobufLibrary()

  • 语法google::protobuf::ShutdownProtobufLibrary();
  • 作用:在程序结束时调⽤ShutdownProtobufLibrary(),为了删除Protocol Buffer库分配的所有全局对象
  • 注意:
    • 对于⼤多数程序来说这是不必要的,因为该过程⽆论如何都要退出,并且操作系统将负责 回收其所有内存
    • 但是,如果使⽤了内存泄漏检查程序,该程序需要释放每个最后对象,或者正在编写可以由单个进程多次加载和卸载的库,那么可能希望强制使⽤Protocol Buffers来清理所有内容

3.–decode

  • 使用示例protoc --decode=contacts2.Contacts contacts.proto < contacts.bin
  • 作用:从标准输⼊中读取给定类型的⼆进制消息,并将其以⽂本格式写⼊标准输出
  • 注意:消息类型必须在.proto⽂件或导⼊的⽂件中定义

5.序列化能力对比验证

  • 此处分别使用PB和JSON,对值完全相同的一份结构化数据进行粗略的性能测试,代码此处略
  • 结果
    100[pb序列化]耗时:0.342ms. 序列化后的⼤⼩:278
    100[pb反序列化]耗时:0.435ms.
    100[json序列化]耗时:1.306ms. 序列化后的⼤⼩:567
    100[json反序列化]耗时:0.926ms.
    
    1000[pb序列化]耗时:3.59ms. 序列化后的⼤⼩:278
    1000[pb反序列化]耗时:5.069ms.
    1000[json序列化]耗时:11.582ms. 序列化后的⼤⼩:567
    1000[json反序列化]耗时:9.289ms.
    
    10000[pb序列化]耗时:34.386ms. 序列化后的⼤⼩:278
    10000[pb反序列化]耗时:45.96ms.
    10000[json序列化]耗时:115.76ms. 序列化后的⼤⼩:567
    10000[json反序列化]耗时:91.046ms.
    
    100000[pb序列化]耗时:349.937ms. 序列化后的⼤⼩:278
    100000[pb反序列化]耗时:428.366ms.
    100000[json序列化]耗时:1150.54ms. 序列化后的⼤⼩:567
    100000[json反序列化]耗时:904.58ms.
    
  • 结论
    • 编解码性能:ProtoBuf的编码解码性能,⽐JSON⾼出2-4倍
    • 内存占⽤:ProtoBuf的内存占⽤只有JSON的约1/2

6.总结

  • JSON、XML、ProtoBuf对比
    请添加图片描述

  • 总结

    • XML、JSON、ProtoBuf都具有数据结构化和数据序列化的能⼒
    • XML、JSON更注重数据结构化,关注可读性和语义表达能⼒
    • ProtoBuf更注重数据序列化,关注效率、空间、速度,可读性差,语义表达能⼒不⾜,为保证极致的效率,会舍弃⼀部分元信息
    • ProtoBuf的应⽤场景更为明确,XML、JSON的应⽤场景更为丰富

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

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

相关文章

Java中获取Class对象的三种方式

Java中获取Class对象的三种方式 1、对象调用getClass()方法2、类名.class的方式3、通过Class.forName()静态方法4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Class对象是一个非常重要的概念&#xff0c;它代…

【carla】ubuntu安装carla环境

我们可以通过查看 CARLA 的 GitHub release 页面来找到最新版本的下载链接。 下载 CARLA 压缩包 访问 CARLA Releases 页面&#xff1a; CARLA Releases on GitHub 查找最新版本&#xff1a; 找到最新的版本&#xff0c;点击下载&#xff0c;第一个压缩包 3. 解压 CARLA 包&…

Python 爬虫 tiktok关键词搜索用户数据信息 api接口

Tiktok APP API接口 Python 爬虫采集Tiktok数据 采集结果页面如下图&#xff1a; https://www.tiktok.com/search?qwwe&t1706679918408 请求API http://api.xxx.com/tt/search/user?keywordwwe&count10&offset0&tokentest 请求参数 返回示例 联系我们&…

Python | Leetcode Python题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:if len(matrix) 0 or len(matrix[0]) 0:return 0maxSide 0rows, columns len(matrix), len(matrix[0])dp [[0] * columns for _ in range(rows)]for i in…

仿qq音乐播放微信小程序模板源码

手机qq音乐应用小程序&#xff0c;在线音乐播放器微信小程序网页模板。包含&#xff1a;音乐歌曲主页、推荐、排行榜、搜索、音乐播放器、歌单详情等。 仿qq音乐播放微信小程序模板源码

量产工具一一页面系统(五)

目录 前言 一、产品页面数据结构抽象 1. page_manager.h 二、产品页面管理器 1.page_manager.c 三、产品页面运行 1.main_page.c 四、单元测试 1.page_test.c 2.上机测试 前言 前面我们实现了显示系统框架&#xff0c;输入系统框架&#xff0c;文字系统框架和UI系统…

WAIC热点聚焦|新质生产力与低空经济

WAIC热点聚焦|新质生产力与低空经济 概览 # WAIC热点聚焦 | 新质生产力与低空经济## 1. 新质生产力定义与特点 - 新质生产力是在新的经济社会发展阶段中形成的&#xff0c;具有变革性和高增长潜力的生产能力。## 2. 低空经济概念与构成 ### 2.1 低空经济定义 - 低空经济是依托…

斯坦福CS224n深度学习培训营课程

自然语言处理领域的经典课程涵盖了从基础知识到最新研究的全面内容。本培训营将精选课程内容&#xff0c;结合实际案例和项目实践&#xff0c;带领学员深入探索自然语言处理的前沿&#xff0c;学习最先进的深度学习技术。 课程大小&#xff1a;2.6G 课程下载&#xff1a;http…

仿哔哩哔哩视频app小程序模板源码

仿哔哩哔哩视频app小程序模板源码 粉色的哔哩哔哩手机视频网页&#xff0c;多媒体视频类微信小程序ui前端模板下载。包含&#xff1a;视频主页和播放详情页。 仿哔哩哔哩视频app小程序模板源码

Linux运维:mysql主从复制原理及实验

当一台数据库服务器出现负载的情况下&#xff0c;需要扩展服务器服务器性能扩展方式有向上扩展&#xff0c;垂直扩展。向外扩展&#xff0c;横向扩展。通俗的讲垂直扩展是将一台服务器扩展为性能更强的服务器。横向扩展是增加几台服务器。 主从复制好比存了1000块钱在主上&…

如何在 PostgreSQL 中实现数据的去重操作,尤其是对于复杂的数据结构?

文章目录 一、基本数据类型的去重二、多列数据的去重三、复杂数据结构的去重&#xff08;一&#xff09;数组类型的去重&#xff08;二&#xff09;JSON 类型的去重&#xff08;三&#xff09;结构体类型&#xff08;复合类型&#xff09;的去重 四、使用 GROUP BY 进行去重五、…

102.二叉树的层序遍历——二叉树专题复习

迭代方式&#xff1a; class Solution {// 定义一个成员变量res来存储层序遍历的结果List<List<Integer>> res new ArrayList<>();// levelOrder方法是层序遍历的接口&#xff0c;它接受一个二叉树的根节点rootpublic List<List<Integer>> lev…

计组-测验题6

7.假设有7位信息码0110101&#xff0c;则低位增设偶校验位的代码和低位增设奇校验位后的代码分别是&#xff08;&#xff09; A.01101010 01101010 B.01101010 01101011 C.01101011 01101010 D.01101011 01101011 B 奇校验码&#xff1a;整个校验码&#xff08;有效信息位…

行内元素、块级元素居中

行内元素居中 水平居中 {text-align&#xff1a;center;}垂直居中 单行——行高等于盒子高度 <head><style>.father {width: 400px;height: 200px;/* 行高等于盒子高度&#xff1a;line-height: 200px; */line-height: 200px;background-color: pink;}.son {}&…

码云远程仓库, 回滚到指定版本号

1. 打开项目路径, 右击Git Bash Here 2. 查找历史版本 git reflog 3. 回退到指定版本 git reset --hard 版本号 4. 强制推送到远程 git push -f

shared_ptr的operator = 里都发生了什么

std::shared_ptr<A01> ptr std::make_shared<A01>(); std::shared_ptr<A01> sec ptr; std::shared_ptr<A01> third ptr; std::cout << sec.use_count() << std::endl; sec third; //这一步的时候&#xff0c;计数有哪些逻辑&#xff1…

智能化代码审查系统设计

设计一个智能化代码审查系统&#xff0c;特别是针对Java开发&#xff0c;需要综合考虑多个维度来提升代码质量、提高审查效率&#xff0c;并促进团队间的协作。以下是该系统设计的关键要素和功能特性&#xff1a; 系统架构 客户端-服务器架构&#xff1a;前端提供友好的Web界面…

三级_网络技术_08_IP地址规划技术

1.如果内网的某Web服务器允许外网访问&#xff0c;并且该服务器NAT转换表如图所示&#xff0c;那么外网主机正确访问该服务器时使用的URL是()。 http://59.12.1.1:1423 http://135.2.2.1 http://135.2.2.1:5511 http://192.168.33.11:80 2.如果内网的某FTP服务器允许外网访…

深度学习3 基于规则的决策树模型

1.决策树是一种归纳学习算法&#xff0c;从一些没有规则、没有顺序、杂乱无章的数据中&#xff0c;推理出决 策模型。不管是什么算法的决策树&#xff0c;都是一种对实例进行分类的树形结构。决策树有三个要素&#xff1a;节点(Node)、分支(Branches)和结果(Leaf)。 训练决策树…

在线制作网页PHP源码+IAPPv3源码

好久以前刚学PHP的时候搞的&#xff0c;现在翻出来并修复了一下就分享出来了&#xff0c;希望可以给初学者一点借鉴学习例子&#xff0c;虽然不是很好哈&#xff0c;但拿来耍耍应该还算可以吧。 使用教程 环境是PHP就行&#xff0c;直接把源码上传到服务器&#xff08;虚拟主…