初识protobuf

news2024/10/7 4:25:14

 

Protobuf

全称Protocol Buffers(协议缓冲区),是一种轻量级、高效的数据序列化格式,由Google开发。它被设计用于结构化数据的序列化、反序列化以及数据交换,常用于网络通信和数据存储等领域。

Protobuf使用简洁的消息描述语言来定义数据结构,然后根据这些描述生成特定语言的代码。这些生成的代码可用于在不同的编程语言之间进行数据的序列化和反序列化操作,从而实现跨平台、跨语言的数据交换。

与其他数据序列化格式(如XML和JSON)相比,Protobuf具有更小的序列化后的数据体积和更高的序列化/反序列化速度。这是因为Protobuf使用二进制格式存储数据,并且生成的代码通常比其他序列化库更加紧凑和高效。

Protobuf还支持向已定义的消息结构添加新字段而不破坏向前和向后的兼容性,这使得它在数据演化和版本管理方面非常灵活。

Protobuf具体应用:

  1. 网络通信:Protobuf常用于网络通信协议的定义和消息传递。通过将数据结构定义为Protobuf消息,并使用生成的代码进行序列化和反序列化,可以实现高效的数据传输和解析,减少网络带宽和处理开销。

  2. 分布式系统:Protobuf在分布式系统中被广泛应用。它可以用于跨节点之间的数据传输、远程过程调用(RPC)和消息队列等,以实现高效、可扩展的分布式通信。

  3. 数据存储:Protobuf可用于将结构化数据序列化到磁盘或数据库中。通过将数据定义为Protobuf消息,可以实现快速的数据存储和检索,同时减小存储空间的占用。

  4. 移动应用:Protobuf在移动应用开发中也有广泛应用。它可以用于移动设备与服务器之间的通信,以及移动设备本地数据的序列化和反序列化。Protobuf的高效性能和较小的数据体积对于移动应用的性能和资源消耗非常重要。

  5. 日志记录:Protobuf可用于日志记录和日志分析。通过将日志消息定义为Protobuf消息,可以在日志系统中存储和传输结构化的日志数据,方便后续的日志分析和处理。

  6. 数据交换和存档:Protobuf可以用作数据交换的中间格式。它可以在不同的系统之间传递和存储数据,同时保持数据的结构和类型信息,确保数据的一致性和可靠性。

具体例子:

一个具体的例子是使用Protobuf来定义和序列化一个简单的用户信息。

首先,创建一个名为user.proto的Protobuf消息定义文件,内容如下:

syntax = "proto3";

message User {
  string name = 1;
  int32 age = 2;
  repeated string hobbies = 3;
}

上述定义了一个名为User的消息类型,包含了姓名(name)、年龄(age)和爱好(hobbies)三个字段。

接下来,使用Protobuf编译器生成相应的代码。可以使用命令行执行以下命令:

protoc --proto_path=PATH_TO_PROTO_FILES --cpp_out=OUTPUT_DIR user.proto

这将会生成C++代码文件 user.pb.huser.pb.cc,它们包含了用于序列化和反序列化User消息的函数和结构体。

现在,可以在C++程序中使用生成的代码来序列化和反序列化User消息。下面是一个简单的示例:

#include "user.pb.h"

int main() {
  // 创建一个User对象并填充数据
  User user;
  user.set_name("Alice");
  user.set_age(25);
  user.add_hobbies("Reading");
  user.add_hobbies("Gaming");

  // 序列化User对象为字节流
  std::string serializedData;
  user.SerializeToString(&serializedData);

  // 反序列化字节流为User对象
  User deserializedUser;
  deserializedUser.ParseFromString(serializedData);

  // 使用User对象的数据
  std::cout << "Name: " << deserializedUser.name() << std::endl;
  std::cout << "Age: " << deserializedUser.age() << std::endl;
  for (const std::string& hobby : deserializedUser.hobbies()) {
    std::cout << "Hobby: " << hobby << std::endl;
  }

  return 0;
}

在上述示例中,首先创建一个User对象,并设置相应的字段值。然后,使用SerializeToStringUser对象序列化为字节流。接着,使用ParseFromString将字节流反序列化为另一个User对象。最后,可以使用反序列化后的User对象来获取和处理数据。

关于protobuf的应用还用很多,初步的了解就是这些。欢迎大家讨论

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

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

相关文章

【实战技能】基于硬件垂直消隐的多缓冲技术在LVGL, emWin,GUIX和TouchGFX应用,含视频教程

原贴地址&#xff1a;https://www.armbbs.cn/forum.php?modviewthread&tid120114 这两天研究了下LVGL的持单缓冲&#xff0c;双缓冲和配合硬件消隐的双缓冲的实现&#xff08;已经分享V5&#xff0c;V6和V7开发板的程序模板&#xff09;&#xff0c;特别是这个整屏缓冲方…

DB-Engines排名公布 GBASE南大通用入围国产数据库TOP 3

什么是DB-Engines排名&#xff1f; DB-Engines排名是数据库领域的流行度榜单&#xff0c;它对全球范围内的419款数据库&#xff08;截至2023年7月&#xff09;进行排名&#xff0c;每月更新一次&#xff0c;排名越靠前&#xff0c;则表示越流行。在很多技术选型的场合&#xf…

Kubernetes——CKA证书

拿到CKA证书啦&#xff0c;打算近期再准备一下备考的学习笔记以及备考经验&#xff0c;有需要的朋友可以点赞加关注&#xff0c;我会持续更新&#xff0c;您的一个赞就能给我一份整理笔记的动力&#xff01;&#x1f92d;

掘金量化—Python SDK文档—5.API 介绍(1)

​ Python SDK文档 5.API 介绍 5.1基本函数 init - 初始化策略 初始化策略, 策略启动时自动执行。可以在这里初始化策略配置参数。 函数原型&#xff1a; init(context)参数&#xff1a; 参数名类型说明contextcontext上下文&#xff0c;全局变量可存储在这里 示例&…

vue2watch监听遇到的问题

1 vue 父组件里引入子组件 显示与隐藏是v-if控制时 父传入子的参数通过watch 监听请求接口时 watch 时而监听不到 请求接口的参数就不对 如图 父组件这么引入子组件v-show 和v-if 是有区别的 2 子组件通过watch 监听后 清空页面要展示的列表数据 重新从第一页加载数据&#x…

程序员如何准备技术面试

程序员如何准备技术面试 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1f604; ✨座右…

Redis常见须知

介绍一下redis数据库 Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符…

【后端面经-Java】JVM垃圾回收机制

【后端面经-Java】JVM垃圾回收机制 1. Where&#xff1a;回收哪里的东西&#xff1f;——JVM内存分配2. Which&#xff1a;内存对象中谁会被回收&#xff1f;——GC分代思想2.1 年轻代/老年代/永久代2.2 内存细分 3. When&#xff1a;什么时候回收垃圾&#xff1f;——GC触发条…

【汉诺塔问题分析】

一、背景 汉诺塔问题是一种经典的递归问题&#xff0c;它由法国数学家Huygens在1665年发现&#xff0c;也是一道有趣的数学难题。这道问题的主要目的是将三根柱子上的一堆盘子移动到另一根柱子上&#xff0c;移动过程中每次只能移动一个盘子&#xff0c;并且大盘子不能放在小盘…

【LeetCode热题100】打卡第40天:翻转二叉树回文链表

文章目录 【LeetCode热题100】打卡第40天&#xff1a;翻转二叉树&回文链表⛅前言 翻转二叉树&#x1f512;题目&#x1f511;题解 回文链表&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第40天&#xff1a;翻转二叉树&回文链表 ⛅前言 大家好&#xff…

高数-第一章-函数-极限 连续

目录 第一章 函数 极限 连续第一节 函数第二节 极限一、极限的概念与性质&#xff08;1&#xff09;数列的极限例1例2 &#xff08;2&#xff09;函数的极限&#xff08;3&#xff09;极限的性质&#xff08;保号性重点 有界性&#xff09;例12例13例14 &#xff08;4&#xff…

Python 3 拷贝、浅拷贝、直接引用

诸神缄默不语-个人CSDN博文目录 复杂的以后再补。 总的来说&#xff0c;像常数、字符串这种比较简单的变量无所谓&#xff0c;但是对于一些复杂对象&#xff08;比如list等&#xff09;&#xff0c;如果直接使ba&#xff0c;相当于直接把a的路径给了b&#xff0c;b这个对象的…

stb_image简单使用

简介stb_image stb_image 是一个非常轻量级的、单文件的图像加载库&#xff0c;用于加载和解码多种图像格式&#xff08;如BMP、JPEG、PNG、GIF等&#xff09;的图像数据。它由Sean T. Barrett开发&#xff0c;并以公共领域&#xff08;Public Domain&#xff09;许可发布&…

【软件测试】web测试bug定位思路总结,“我“不再背锅...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 需要掌握的知识 …

LabVIEW - 采集声音并保存 wav 文件

1. 题目 编写程序&#xff0c;实现用户点击按钮时&#xff0c;采集声音&#xff0c;显示声音波形&#xff0c;对于采集的声音进行低频段、中频段、高频段分别进行适当的比例放大或者衰减&#xff0c;然后重新合成(三段相加即可)&#xff0c;并将合成的声音下入wav格式的文件保存…

【ROS】ROS1人机界面开发:第一个最简ROS+QtGui程序(按钮启动发布者)

【ROS】郭老二博文之:ROS目录 1、创建工程 1)新建工程:Other Project --> ROS Workspace 2)设置工程名称、路径 3)可以通过点击“Browse”来创建目录 注意:使用自带ros插件的qtcreator-ros,无法创建目录、也不能选择目录,这是个bug,因此需要在终端手动创建目录…

江南大学轴承数据故障诊断(利用连续小波变换转换为二维图像,再利用CNN进行故障诊断)

1.江南大学轴承数据集介绍 采样频率&#xff1a;50khz&#xff0c;采样时间&#xff1a;10s 转速&#xff1a;600 800 1000/rpm 内圈&#xff1a;ib 外圈&#xff1a;ob 滚动体&#xff1a;tb 正常&#xff1a;N 以600转速下的内圈故障数据为例展示&#xff1a; 开始数据…

【云原生】Prometheus 之PromQL

前言 当 Prometheus 通过 Exporter 采集到相应的监控指标样本数据后&#xff0c;我们就可以通过PromQL 对监控样本数据进行查询&#xff0c;从而对相应的数据样本进行分析以及制定报警规则。 1. PromQL的简介 PromQL&#xff08;Prometheus Query Language&#xff09;是 Prome…

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平&#xff0c;包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解&#xff0c;以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…

STM32案例学习 GY-39环境监测传感器模块

STM32案例学习 GY-39环境监测传感器模块 硬件平台 野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块 GY-39环境监测传感器模块 GY-39 是一款低成本&#xff0c;气压&#xff0c;温湿度&#xff0c;光强度传感器模块。工作电压 3-5v…