在这里插入图片描述

一、核心概念解析

1. 什么是数据序列化?

序列化
反序列化
程序对象
字节流
程序对象
  • 序列化:将数据结构或对象转换为二进制/文本格式
  • 反序列化:将二进制/文本数据还原为数据结构

2. Protobuf 的定位

特性ProtobufJSONXML
数据格式二进制文本文本
大小⭐ 非常小极大
速度⭐ 非常快极慢
可读性不可读可读可读
类型安全⭐ 强类型弱类型弱类型

二、核心工作原理

1. 定义数据结构(.proto 文件)

syntax = "proto3";message Person {int32 id = 1;              // 唯一IDstring name = 2;           // 姓名string email = 3;          // 邮箱repeated string phones = 4; // 电话列表enum PhoneType {MOBILE = 0;HOME = 1;WORK = 2;}message PhoneNumber {string number = 1;PhoneType type = 2;}repeated PhoneNumber phone_numbers = 5; // 结构化电话列表
}

2. Protobuf 编译器工作流程

开发者 protoc 编译器 目标语言 编写 .proto 文件 生成语言特定代码 如 Python/Java/C++类 在代码中使用生成的类 开发者 protoc 编译器 目标语言

3. 二进制编码原理

Protobuf 使用 Tag-Length-Value (TLV) 编码:

Tag
Length
Value
TLV
字段1
字段编号+数据类型
数据长度-可选
实际数据
字段2
...
  • Tag:字段唯一标识(1-5字节)
  • Value:实际数据(变长编码)

三、核心优势详解

1. 极致性能

操作ProtobufJSON提升倍数
序列化时间0.15ms0.92ms6x
反序列化时间0.12ms0.87ms7x
数据大小28字节118字节4.2x

测试数据基于相同 Person 对象(来源:Google 基准测试)

2. 跨语言支持

Protobuf 官方支持语言:

    title 语言支持度“C++/Java/Python” : 45“Go/C#/Ruby” : 25“PHP/Node.js” : 15“Dart/Objective-C” : 10“其他” : 5

3. 版本兼容机制

message Person {int32 id = 1;     // 必填字段string name = 2;  // 必填字段// 新添加的字段(兼容旧版)string email = 3;  // 可选字段(新版本添加)// 已废弃字段(仍可读取旧数据)reserved 4;       // 保留字段编号reserved "old_field";
}
  • 向前兼容:新代码读取旧数据
  • 向后兼容:旧代码读取新数据

四、实际应用示例(Python)

1. 安装 Protobuf

pip install protobuf

2. 使用生成的代码

# 导入生成的类
import person_pb2# 创建对象
person = person_pb2.Person()
person.id = 123
person.name = "张三"
person.email = "zhangsan@example.com"
person.phones.append("13800138000")# 添加结构化电话
phone = person.phone_numbers.add()
phone.number = "13900139000"
phone.type = person_pb2.Person.PHONE_TYPE_MOBILE# 序列化为二进制
binary_data = person.SerializeToString()
print(f"序列化大小: {len(binary_data)} bytes")# 反序列化
new_person = person_pb2.Person()
new_person.ParseFromString(binary_data)print(f"反序列化姓名: {new_person.name}")
print(f"手机号: {new_person.phone_numbers[0].number}")

3. 输出结果

序列化大小: 48 bytes
反序列化姓名: 张三
手机号: 13900139000

五、适用场景分析

1. 推荐使用场景

高性能网络通信
微服务间通信
大数据存储
高效持久化
跨语言数据交换
多语言系统集成
实时系统
低延迟要求

2. 不适用场景

  • 人类可读的配置文件
  • 需要直接编辑的持久化数据
  • 简单前端-后端通信(通常用JSON更合适)

六、与 gRPC 的关系

定义
定义
使用
Protobuf
服务接口
数据结构
gRPC
网络通信
  • Protobuf 是 gRPC 的接口定义语言(IDL)数据序列化格式
  • gRPC 使用 Protobuf 定义服务和消息格式
  • 90% 的 gRPC 实现使用 Protobuf 作为默认序列化器

七、生态系统工具

1. 核心工具链

工具用途示例命令
protoc编译器protoc --python_out=. person.proto
protobuf-runtime运行时库Python: import google.protobuf
protoc-gen-goGo语言插件protoc --go_out=. person.proto

2. 高级工具

Protobuf
数据验证
Linting
格式检查
文档生成

八、版本演进

Protobuf 版本对比

特性proto2proto3
语法required/optional所有字段可选
默认值可自定义零值(0, “”, false)
枚举首字段需为0首字段必须为0
JSON 支持有限完整支持
新类型Any, Oneof, Map

最佳实践:新项目应直接使用 proto3 语法

九、性能优化技巧

  1. 复用消息对象:避免频繁创建新对象

    # 好:复用对象
    person = person_pb2.Person()
    for data in dataset:person.ParseFromString(data)process(person)person.Clear()# 差:频繁创建新对象
    for data in dataset:person = person_pb2.Person()person.ParseFromString(data)process(person)
    
  2. 使用bytes代替string:当处理二进制数据时

    // 推荐
    bytes image_data = 4;// 不推荐
    string image_data = 4; // 会有额外编码开销
    
  3. 预分配重复字段

    # 预先分配空间
    person.phones.reserve(10)  # 预分配10个位置
    for phone in phone_numbers:person.phones.append(phone)
    

十、行业应用案例

  1. Google:几乎所有内部RPC通信
  2. Kubernetes:ETCD存储格式、API对象定义
  3. Netflix:微服务间通信
  4. Uber:地理位置数据传输
  5. Spotify:音乐元数据传输

根据2023年CNCF调查,82%的云原生项目使用Protobuf作为主要序列化格式

总结:Protobuf核心价值

title Protobuf 核心优势“高性能” : 40“跨平台” : 25“强类型” : 20“版本兼容” : 15

Protobuf 通过其高效的二进制编码强大的跨语言支持优秀的版本兼容性,成为现代分布式系统和微服务架构的首选数据交换格式。虽然学习曲线较JSON更陡峭,但在性能敏感场景下带来的收益远超其学习成本。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高斯混合模型GMMK均值(十三-1)——K均值是高斯混合模型的特例

EM算法与K均值算法的关系 K均值可以看成是高斯混合模型的特例。 对K均值算法与EM算法进行比较后,可以发现它们之间有很大的相似性。K均值算法将数据点硬(hard)分配到聚类中,每个数据点唯一地与一个聚类相关联,而EM算法…

StarRocks 向量索引如何让大模型“记性更好”?

随着 ChatGPT、DeepSeek 等大语言模型的普及,我们已经能够与 AI 进行流畅的对话。然而,即使是最先进的大模型也面临着“记忆困境”,具体表现模型只能记住训练时接触的知识,且这些知识在使用时很可能会过期。实际应用或在处理特定领…

UniApp Vue3 模式下实现页面跳转的全面指南

1. 引言 1.1 UniApp 与 Vue3 的结合优势 UniApp 是一个使用 Vue.js 开发所有前端应用的框架,支持编译到 iOS、Android、H5、以及各种小程序平台。Vue3 提供了更高效的响应式系统和 Composition API,使开发体验更加现代化和灵活。 1.2 页面跳转在应用开发中的重要性 页面跳…

Solidity学习 - ABI 应用二进制接口

文章目录 一、ABI 基础概念1. ABI 与 API 的区别2. ABI 的核心作用 二、ABI 接口描述1. 编译后的产物2. ABI JSON 格式示例3. ABI JSON 关键字段说明 三、ABI 编码1. 编码示例2. 编码数据的组成3. Solidity 中的编码函数 四、ABI 解码1. 解码的基本概念2. 事件日志的解码 五、A…

星际争霸数据集指南

星际争霸作为检验AI效果的一个重要“模式生物”, 是验证AI技术的重要平台‌,尤其在 深度学习 和 强化学习领域。该游戏因其复杂的游戏机制和实时决策要求,为AI研究提供了丰富的测试环境和挑战。 本博文是记录自己曾经研究星际争霸AI时对于数据部分的一点…

VUE组件与组件之间的传参

每次启动vue2项目的时候在 vue.config.js中配置: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,//关闭语法严格检验lintOnSave:false})1:在 src 下 创建 utils 文件夹 然后创建 Bas…

8年java开发从零学习人工智能(深度学习)--pp飞桨(百度自研开源框架)

1.明确概念:人工智能>机器学习>深度学习,三者的关系是包含关系,如图所示: 人工智能(AI),很宽泛的概念,是研发用于模拟,延展和扩展人的智能的理论,方法&…

ci | cd

ci | cd 相当于开发人员和运维人员共同完成的东西 ci:Jenkins cd:k8s ci : 持续集成 开发人员写出的代码提交到共享仓库 比如说Git 自动触发代码检查 测试 好处: 很快的发现bug 代码不用堆积 cd: 持续交付:代码测试没问题后 自动打包…

深入理解C#委托操作:添加、移除与调用全解析

关键词:委托不可变性 多播委托 调用列表管理 ⚙️ 一、委托的核心特性:不可变性 看似“添加”,实为新建 使用 为委托“添加”方法时(如 delVar SCl.m3;): 系统创建全新委托对象新委托的调用列表 原…

Spring Cloud:微服务架构的基石与实践指南

一、Spring Cloud 核心组件 (一)Spring Cloud Netflix Spring Cloud Netflix 是 Spring Cloud 的核心模块之一,它集成了 Netflix 的多个开源组件,提供了微服务架构中常见的功能,如服务注册与发现、配置中心、API 网关…

【VPX3U】国产嵌入式平台:RK3588J×JH930硬件架构与红外应用方案

随着对边缘计算与多媒体处理需求的提升,国产异构平台成为关键发展方向。最近有一个项目需求,提出了一款基于瑞芯微 RK3588J 处理器与景嘉微GPU 的 VPX3U 规格嵌入式主板的设计想法旨在融合高性能异构计算与丰富的视频、网络和存储接口,适用于…

秩序密码-用群论分析魔方的阶

三阶魔方的物理基础是由一个三维十字轴连接的 6 个中心块,这 6 个中心块决定了魔方的 6 种颜色朝向,构成不动的坐标系统,此外还有两类活动块,分别是8个角块,12个棱块。 魔方的每一层转动(如 R: 右层顺时针…

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考 最近,自动驾驶行业火得不行,背后支撑它的技术,远不止车载摄像头那么简单。真正让车“看懂”世界的,是多种传感器数据的“融合”,包括雷达、激光雷达(LiDAR)、摄像头、惯性测量单元(IMU)等等。 而如…

机器学习-- 聚类

什么是聚类? Clustering 可以简单地说,对有标注的数据分类,就是逻辑回归(属于有监督分类),对无标注的数据分类,就是聚类(属于无监督分类) 聚类是一种无监督学习技术&am…

【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南

文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本,接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标:tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…

BigFoot RaidSlackCheck11.109.zip lua

BigFoot RaidSlackCheck11.109.zip lua 合剂buff检查插件 把lua脚本拷贝到游戏插件目录下: D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns 命令 /rsc 下载地址: https://download.csdn.net/download/spencer_tseng/91181827

深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师

在构建现代网页时&#xff0c;我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架&#xff0c;却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者&#xff0c;无声地承担着定义文档元数据、指导浏览器行为、优化搜…

青少年编程与数学 01-012 通用应用软件简介 11 应用商店

青少年编程与数学 01-012 通用应用软件简介 11 应用商店 一、什么是应用商店&#xff08;一&#xff09;应用商店的基本定义&#xff08;二&#xff09;应用商店的工作原理&#xff08;三&#xff09;应用商店的类型 二、应用商店的重要意义&#xff08;一&#xff09;为用户提…

《红黑树实现》

引言&#xff1a; 上次我们学习了比二叉搜索树更高效的平衡二叉搜索树&#xff08;AVL树&#xff09;&#xff0c;这次我们要学习的是另外一种对二叉搜索树的优化后的红黑树。 一&#xff1a;红黑树概念&#xff1a; 红黑树是一棵二叉搜索树&#xff0c;他的每个结点增加一个…

领域驱动设计(DDD)【23】之泛化:从概念到实践

文章目录 一 泛化基础&#xff1a;理解DDD中的核心抽象机制1.1 什么是泛化&#xff1f;1.2 为什么泛化在DDD中重要&#xff1f;1.3 泛化与特化的双向关系 二 DDD中泛化的实现形式2.0 实现形式概览2.1 类继承&#xff1a;最直接的泛化实现2.2 接口实现&#xff1a;更灵活的泛化方…