2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程
Protobuf 序列化概述
Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过编译生成特定语言的代码。它的优点包括小巧的二进制格式、高效的序列化速度和向后兼容性,非常适合需要高性能和跨语言的应用场景。
常见序列化格式
序列化格式 | 描述 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
JSON | 一种轻量级的数据交换格式,使用文本表示,基于键值对。 | 可读性好,跨平台、跨语言支持广泛,解析库多 | 体积较大,性能较低(相较于二进制格式) | Web应用,API通信 |
XML | 类似HTML的标记语言,用于表示结构化数据。 | 结构化良好,支持复杂的数据类型 | 冗余较大,体积大,解析速度慢 | 早期Web服务,严格的数据验证 |
Protobuf | Google开发的二进制序列化格式,高效、语言中立。 | 高效的二进制格式,传输速度快,向后兼容性好 | 不可读,需定义.proto文件并编译 | 高性能系统,服务间通信(gRPC) |
Avro | Apache开发的序列化格式,适合大数据处理。 | 数据描述和数据一起存储,支持丰富的数据类型 | 需要架构支持,工具复杂度高 | 大数据处理,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,用于在序列化时识别字段,范围为 1
到 2^29 - 1
。
proto 常见字段类型
类型 | 说明 |
---|---|
int32 | 32位整型 |
int64 | 64位整型 |
float | 32位浮点数 |
double | 64位浮点数 |
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 进行云服务资源的管理与自动化配置编写和部署基础设施的自动化脚本 …...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...