当前位置: 首页 > news >正文

2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程

Protobuf 序列化概述

Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过编译生成特定语言的代码。它的优点包括小巧的二进制格式、高效的序列化速度和向后兼容性,非常适合需要高性能和跨语言的应用场景。

在这里插入图片描述

常见序列化格式

序列化格式描述优点缺点适用场景
JSON一种轻量级的数据交换格式,使用文本表示,基于键值对。可读性好,跨平台、跨语言支持广泛,解析库多体积较大,性能较低(相较于二进制格式)Web应用,API通信
XML类似HTML的标记语言,用于表示结构化数据。结构化良好,支持复杂的数据类型冗余较大,体积大,解析速度慢早期Web服务,严格的数据验证
ProtobufGoogle开发的二进制序列化格式,高效、语言中立。高效的二进制格式,传输速度快,向后兼容性好不可读,需定义.proto文件并编译高性能系统,服务间通信(gRPC)
AvroApache开发的序列化格式,适合大数据处理。数据描述和数据一起存储,支持丰富的数据类型需要架构支持,工具复杂度高大数据处理,Hadoop和Kafka环境
MessagePack一种高效的二进制序列化格式,比JSON更紧凑。二进制格式更紧凑,解析速度快人类不可读,调试较难网络通信,资源受限环境

序列化(Serialization)

序列化是指将对象或数据结构转换成一种可以保存到文件或传输到网络上的格式的过程。这种格式通常是二进制或文本格式,便于传输或存储。通过序列化,复杂的数据结构(如对象、数组、字典等)可以被转换为线性的字节流。

序列化作用

持久化存储:数据可以被序列化后保存到磁盘,供将来使用。
数据传输:序列化后的数据可以在网络上传输,便于不同的计算机或进程间交换数据。
跨语言交互:通过中立的序列化协议(如Protobuf、JSON、XML),不同编程语言之间可以交换数据。

反序列化(Deserialization)

反序列化是序列化的逆过程,它将字节流或文件恢复为原始的对象或数据结构。通过反序列化,接收到的或读取的序列化数据可以重新恢复成在发送端的对象格式。

反序列化作用

数据恢复:可以从磁盘、数据库或网络中读取序列化的数据并恢复为内存中的数据结构。
跨语言兼容性:接收到的序列化数据可以通过反序列化恢复成接收端系统中相应的结构。

.proto文件用于定义Protobuf的消息结构,它通过声明消息类型、字段、枚举等内容,生成用于序列化和反序列化的代码。以下是Protobuf的.proto文件语法格式的基本构成和示例。

proto 基本语法

syntax:指定 Protobuf 的语法版本,常用的是 proto3。Protobuf 的语法版本主要分为两个版本:proto2 和 proto3。它们在功能和约束上有所不同,proto3 是 proto2 的简化和改进版本。

syntax = "proto3";

package:用于在 .proto 文件中定义消息所在的包名,类似于编程语言中的命名空间(namespace)。它可以帮助在生成代码时避免命名冲突,并组织和管理生成的代码结构。

在 Protobuf 编译器生成的代码中,package 会影响生成文件的路径或命名。例如在 Java 中 package 会映射到相应的包结构。在 Python 中它可以影响模块导入的结构。

package mypackage;

import:在 Protobuf 中,import 允许你在一个 .proto 文件中引用和使用其他 .proto 文件定义的消息、枚举或服务。这在大型项目中非常有用,可以将不同的消息定义拆分成多个文件,从而更好地组织和管理代码。

import "other.proto";

message:定义一个消息类型(相当于面向对象编程中的类)。在 Protobuf 中,message 用于定义一个消息类型(类似于面向对象编程中的类),它表示一种结构化数据格式。每个 message 包含一组字段,每个字段有一个类型、名称和唯一的标识符(tag),用于标记在序列化和反序列化过程中字段的顺序。

message MyMessage {int32 id = 1;string name = 2;
}

Protobuf 字段类型

标量类型:Protobuf支持多种基本数据类型,例如 `int32`, `int64`, `float`, `double`, `bool`, `string`, `bytes`等。
repeated:表示字段可以重复,类似于数组或列表。
自定义类型:可以引用其他消息类型或枚举类型。

enum:定义枚举类型。在 Protobuf 中,enum 用于定义枚举类型,它表示一组固定的常量值。每个枚举值都有一个唯一的名称和对应的整数值,整数值通常从 0 开始递增。enum 类似于其他编程语言中的枚举类型,常用于表示状态、类型、选项等离散的固定值集合。

enum Status {UNKNOWN = 0;STARTED = 1;COMPLETED = 2;
}

service:定义服务和RPC方法(主要用于gRPC)。服务是逻辑上的一组功能或操作,定义了客户端和服务器之间的接口。在 gRPC 中,服务使用 service 关键字定义。一个服务可以包含多个 RPC 方法。

RPC 方法是服务中的具体操作,描述了客户端如何请求服务器执行某项任务。每个 RPC 方法都有输入消息和输出消息。输入消息定义了客户端发送给服务器的数据结构。输出消息定义了服务器返回给客户端的数据结构。

service MyService {rpc GetUser (UserRequest) returns (UserResponse);
}
RPC 方法:输入消息
message UserRequest {int32 user_id = 1;
}
RPC 方法:输出消息
message UserResponse {string name = 1;string email = 2;
}

tag:每个字段都有一个唯一的 tag,用于在序列化时识别字段,范围为 12^29 - 1

proto 常见字段类型

类型说明
int3232位整型
int6464位整型
float32位浮点数
double64位浮点数
bool布尔型
string字符串
bytes二进制数据
repeated重复字段,相当于数组或列表

proto3 案例

syntax = "proto3";package example;enum TaskStatus {PENDING = 0;IN_PROGRESS = 1;DONE = 2;
}message Task {int32 id = 1;string description = 2;TaskStatus status = 3;repeated string labels = 4;   // 标签数组
}service TaskService {rpc CreateTask(Task) returns (Task);rpc GetTask(Task) returns (Task);
}

编译 .proto 文件

使用 Protobuf 编译器(protoc)可以生成目标语言的代码(例如 C++、Python、Java)。编译后会生成相应语言的类,用于序列化和反序列化定义的消息。

protoc --python_out=. yourfile.proto

相关文章:

2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程

Protobuf 序列化概述 Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过…...

【小程序】微信小程序课程 -4 项目实战

目录 1、 效果图 2、创建项目 2.1 创建小程序端 2.1.1 先创建纯净项目 2.1.2 删除components 2.1.4 删除app.json红色部分 2.1.5 删除index.json红色部分 2.1.6 删除index.wxss全部内容 2.1.7 删除index.wxml全部内容 2.1.8 app.json创建4个页面 2.1.9 app.json添加…...

【期刊】论文索引库-SCI\SSCI\IE\南大核心\北大核心\CSCD等

外文期刊检索 SCI SCI即《科学引文索引》(Science Citation Index),是由美国科学信息研究所(Institute for Scientific Information)创建于1961年,收录文献的作者、题目、源期刊、摘要、关键词,不仅可以从文献引证的角度评估文章的学术价值,还可以迅速方便地组建研究课…...

开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎

摘要:本文深入探讨在社交电商领域中,团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序,打造具有强大竞争力的团队,实现个人价值与影响力的放大,创造被动收入,迈向财富自由之路,同时为…...

使用Fiddler Classic抓包工具批量下载音频资料

1. 通过F12开发者工具,下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体,播放一个音频文件,右边媒体下生成一个音频文件,右击“在新标签页中打开”,可以下载这个音频文件。 2.通过Fiddler Classic抓…...

QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用

介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面,显示红、黄、绿三色信号灯,并通过定时器控制信号灯的切换。同时,我们还将实现一个带有按钮的界面,用于展示信号灯的状态。 1. 安装Qt开…...

【编程基础知识】网络I/O模型详解:从阻塞到异步

引言 网络I/O模型是网络编程的核心,它们决定了应用程序如何进行读写操作以与网络进行数据交换。了解不同的网络I/O模型对于设计高效、可扩展的网络应用程序至关重要。 一、阻塞I/O(Blocking I/O) 1. 定义 阻塞调用:当应用程序…...

yolo自动化项目实例解析(六)自建UI(主窗口、预览窗口)

前面我们大致把各个代码块梳理出来了,但是还是不知道从那块开始,我们这里主要先通过ui页面的元素去推理整个执行过程,我们首先需要知道ui功能里面有那些组件 qt设计师基础控件 Qt Designer 是一个图形界面设计工具,用于创建 Qt 应…...

Unity优质教程分类汇总 【持续更新中】

以下收录的均为作者自己看过的觉得比较好的教程 基础 Unity入门: https://www.bilibili.com/video/BV1HX4y1V71E?p13 生命周期 https://docs.unity.cn/cn/2022.3/uploads/Main/monobehaviour_flowchart.svg https://zhuanlan.zhihu.com/p/551294000 编程技巧…...

真正掌握left join on 和 where 的差别

总结 用 where 是先连接然后再筛选用 on 是先筛选再连接数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下: on条件是在生成临时表…...

神经网络在多分类问题中的应用

作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~个人主页:小高要坚强的博客当前专栏:Python之机器学习本文内容:神经网络在多分类问题中的应用作者“三要”格言:要坚强、要努力、要学习 目录 1. 引言 2.数据构造 3.划分数据集 4.神经网络实现多…...

nginx的安装和使用

源码安装 1.环境准备:卸载其他方式安装的web应用,防止端口冲突 2.下载nginx源码包 wget https://nginx.org/download/nginx-1.20.2.tar.gz 3.源码编译安装 yum install -y gcc pcre-devel zlib-devel #安装依赖包 useradd -M -s /sbin/nologin ngi…...

js采用覆盖键、覆盖鼠标滑动事件实现禁止网页通过 ctrl + +/- 和 ctrl + 滚轮 对页面进行缩放

一、兼容电脑端的禁止通过 ctrl /- 和 ctrl 滚轮 对页面进行缩放 const keyCodeMap {// 91: true, // command61: true,107: true, // 数字键盘 109: true, // 数字键盘 -173: true, // 火狐 - 号187: true, // 189: true, // -};二、覆盖ctrl||command ‘’/‘-’ // 覆…...

某客户Oracle RAC无法启动故障快速解决

某日,9:50左右接到好友协助需求,某个客户Oracle RAC无法启动,并发过来一个报错截图,如下: 和客户维护人员对接后,远程登录服务端进行故障分析。 查看hosts信息,首先进行心跳测试,测…...

【计算机网络 - 基础问题】每日 3 题(二十八)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...

探索甘肃非遗:Spring Boot网站开发案例

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…...

产品管理- 互联网产品(6):产品测试

可用性测试 招募有代表性用户作为测试代表参与者,评估某产品符合特定可用性及符合程度。以具有代表性的用户为测试样本。 测试中多关注用户表情与动作。多鼓励与测试的用户更多的操作以用户角度发现问题。同时要做好询问工作,耐心聆听用户的意见&#x…...

奖金高达 110 万元,Spatial Joy 2024 全球 AR 应用开发大赛启动

今年是AR应用开发大赛第三届,恰逢Rokid成立十周年,我们推出全新的大赛品牌“Spatial Joy”,引领开发者享受开发乐趣,为其打造充满挑战和惊喜的开发之旅,逐渐成为空间计算时代全球最大AR应用开发大赛。回顾大赛发展&…...

git add成功后忘记commit的文件丢了?

本文目标:开发人员,在了解git fsck命令用法的条件下,进行git add成功但由于误操作导致丢失的文件找回,达到找回丢失文件的程度。 文章目录 1 痛点2 解决方案3 总结/练习 1 痛点 开发过程中,分支太多(基线分…...

Python Web 开发中的DevOps 实践与自动化运维

Python Web 开发中的DevOps 实践与自动化运维 📚 目录 🔧 基础设施即代码(IaC) 使用 Terraform、AWS CloudFormation 实现基础设施即代码使用 Python 进行云服务资源的管理与自动化配置编写和部署基础设施的自动化脚本 &#x1f…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟

众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了&#xff0c;延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp &#xff0c;边缘服务器拉流推送到云服务器 …...