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 进行云服务资源的管理与自动化配置编写和部署基础设施的自动化脚本 …...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
