初识protobuf

 

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的应用还用很多,初步的了解就是这些。欢迎大家讨论

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

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

相关文章

解决appium-doctor报 bundletool.jar cannot be found

一、下载bundletool.jar 下载地址&#xff1a;https://github.com/google/bundletool/releases 二、重命名 重命名这个jar包为bundletool.jar&#xff0c;在android sdk目录下&#xff0c;新建bundle-tool目录&#xff0c;把bundletool.jar包放入其中。 三、配置环境 path后追加…

re学习(19)[ACTF新生赛2020]easyre1(UPX脱壳)

文章链接&#xff1a;BUUCTF在线评测 参考视频&#xff1a;B站 【新手教程三】小Z带你学习什么是ESP定律和什么是堆栈平衡 &#xff1f; - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 题解&#xff1a; 工具脱壳 key"*F\"N,\"…

蒲公英打包环境搭建碰到问题

一&#xff1a;证书那边选择手动&#xff0c;不要自动&#xff0c;——》debug配置dev证书&#xff0c;release配置ad-hoc证书 二&#xff1a;证书有时候不生效&#xff0c;删除重新下载。~/Library/MobileDevice/Provisioning Profiles 三&#xff1a;更新测试手机时&#…

# Linux终端控制字符详解以及简单应用实践

Linux终端控制字符详解以及简单应用实践 文章目录 Linux终端控制字符详解以及简单应用实践1 控制字符表2 控制字符 ESC &#xff08;0x1B&#xff0c;^[&#xff09;子参数表3 控制字符 ESC &#xff08;0x1B&#xff0c;^[&#xff09;子参数表 - 字符颜色参照表4 实践&#x…

SpringBoot+JWT实现单点登录解决方案

一、什么是单点登录? 单点登录是一种统一认证和授权机制&#xff0c;指在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的系统&#xff0c;不需要重新登录验证。 单点登录一般用于互相授信的系统&#xff0c;实现单一位置登录&#xff0c;其他信任的…

【JavaEE面试题(九)线程安全问题的原因和解决方案】

多线程-初阶 4. 多线程带来的的风险-线程安全 (重点)4.1 观察线程不安全原因是 1.load 2. add 3. save 4.2 线程安全的概念4.3 线程不安全的原因最根本的是 操作系统对线程的调度是随机的★1. 修改共享数据&#xff08;多个线程修改同一个变量&#xff09;★2. 操作不是原子性★…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则&#xff1a; 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

前端 | (七)浮动 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;浮动介绍&#x1f407;元素浮动后的特点&#x1f407;浮动小练习&#x1f525;盒子1右浮动&#x1f525;盒子1左浮动&#x1f525;所有盒子都浮动&#x1f5…

后端Linux软件安装大全[JDK、Tomcat、MySQL、Irzsz、Git、Maven、Redis...持续更新中]

文章目录 前言1.软件安装方式2.安装jdk3.安装Tomcat4.安装MySQL5.安装lrzsz6. 安装Git7. 安装Maven8. 安装Redis 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的…

Vue第三篇:最简单的vue购物车示例

本文参考&#xff1a;Vue Cli&#xff08;脚手架&#xff09;实现购物车小案例 - - php中文网博客 效果图&#xff1a; 编写流程&#xff1a; 1、首先通过vue/cli创建工程 vue create totalprice 2、改写App.vue代码如下&#xff1a; <template><div><div v…

【深度学习笔记】训练 / 验证 / 测试集

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

【电路原理学习笔记】第3章:欧姆定律:3.1 电压、电流与电阻的关系

第3章&#xff1a;欧姆定律 3.1 电压、电流与电阻的关系 欧姆定律指出&#xff1a;电流与电压成正比&#xff0c;与电阻成反比。即 I V R I\frac{V}{R} IRV​ 3.1.1 电压与电流之间的线性关系 数学上&#xff0c;线性指的是变量之间的关系在图形上是一条直线。线性方程所对…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

分布式运用——存储系统Ceph

分布式运用——存储系统Ceph 一、Ceph 介绍1.Ceph 简介2、存储基础2.1 单机存储设备2.2 单机存储的问题2.3 商业存储解决方案2.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09;2.5 分布式存储的类型 3.Ceph 优势3.1 高扩展性3.2 高可靠性3.3 高性能3.4 功能强大 4.Cep…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

mysql中的行格式之compact格式分析

mysql中的行格式之compact格式分析 mysql行格式 所谓行格式&#xff0c;就是指mysql一行数据的存储格式。 InnoDB 储存引擎支持有四种行储存格式&#xff1a;Compact、Redundant、Dynamic 和 Compressed。 Redundant是很古老的行格式了&#xff0c;因为占用空间最多&#x…

(1)ADS-B接收机

文章目录 前言 1.1 所需硬件 1.2 连接到自动驾驶仪 1.3 设置 1.4 ADSB输出配置 1.5 启用载人飞行器避障功能 1.6 飞行器数据库 1.7 开发者信息包括模拟 前言 本文介绍了如何安装和配置 ADS-B 模块&#xff0c;以便你的飞机能够知道附近的其他飞机和空中交通管制&#x…

CSS样式

1.高度和宽度 .c1{height:300px;width:500px;}注意事项&#xff1a; 宽度支持百分比&#xff0c;高度不支持。行内标签&#xff1a;默认无效会计标签&#xff1a;默认有效&#xff08;霸道&#xff0c;右侧区域空白&#xff0c;也不给你用&#xff09; 2.块级和行内标签 块…

微服务架构+创建微服务工程(商品/订单)

目录 1.微服务架构 1.1.单体应用架构 1.2.微服务应用 1.3 微服务架构的优势 1.4.微服务架构的缺点(挑战) 1.5. SpringCloud与微服务关系 1.6.SpringBoot和SpringCloud关系 2. 创建微服务工程 2.1.数据库 2.2.搭建父工程 2.2 创建公共模块 2.3.商品系统 2.4.订单微…

Linux/Unix-gcc编译回顾

1、gcc编译为可执行程序四步骤&#xff1a;预处理->编译->汇编->链接 注意&#xff1a;-o 用于修改生产的文件名 2、gcc常用参数 指定头文件&#xff1a;-I 语法&#xff1a; gcc -I 头文件所在文件夹路径 源文件 -o 生成文件名 如果头文件和源文件中同一个文件夹…