protobuf序列化

Protocol Buffers (protobuf) 是一种由 Google 开发的轻便、高效的结构化数据序列化格式,常用于数据存储或在应用程序之间传输数据。它可以将数据结构(如对象、消息)转换为字节流,以便在网络上进行传输或存储。

Protobuf序列化基本流程

  1. 定义消息结构: 首先,定义消息结构。消息结构通常使用 .proto 文件来描述。该文件使用一种类似于结构体定义的语言来指定消息中的字段以及字段的类型。

  2. 编译 .proto 文件: 使用 protoc 编译器将 .proto 文件编译成目标编程语言的源代码(例如 C++, Java, Python 等)。这样可以在代码中使用自动生成的类进行数据的序列化和反序列化。

  3. 序列化: 使用自动生成的类和方法,将数据对象序列化为字节流(byte[])。

  4. 反序列化: 将字节流反序列化回消息对象。

示例

1. 定义 .proto 文件

假设我们有一个简单的消息结构,表示一个人,包含姓名、年龄和邮箱

syntax = "proto3";message Person {string name = 1;int32 id = 2;string email = 3;
}
  • syntax = "proto3"; 表示使用 Protobuf 版本 3 语法。
  • message 用于定义消息类型,Person 是消息类型的名称。
  • 每个字段有一个类型(如 stringint32 等)和一个唯一的字段编号(如 123 等)。
2. 编译 .proto 文件

使用 protoc 命令将 .proto 文件编译为目标编程语言的代码。例如,若要生成 Python 代码:

protoc --python_out=. person.proto

这将生成一个 person_pb2.py 文件,该文件包含一个 Person 类,用于在 Python 中处理序列化和反序列化。

3. 序列化和反序列化(Python 示例)

序列化:将数据对象转换为字节流

import person_pb2# 创建 Person 对象
person = person_pb2.Person()
person.name = "Alice"
person.id = 1234
person.email = "alice@example.com"# 序列化为字节流
serialized_data = person.SerializeToString()# 打印序列化的字节数据
print(serialized_data)

反序列化:将字节流转换回数据对象

# 假设我们收到一个序列化的字节流
received_data = serialized_data# 创建一个新的 Person 对象来存储反序列化的数据
received_person = person_pb2.Person()
received_person.ParseFromString(received_data)# 打印反序列化后的数据
print(f"Name: {received_person.name}")
print(f"ID: {received_person.id}")
print(f"Email: {received_person.email}")

常见操作

  • 序列化到文件: 可以将序列化后的字节流保存到文件中,以便以后读取。

  • 从文件读取并反序列化: 可以从文件中读取序列化的数据并进行反序列化。

with open("person_data.bin", "wb") as f:f.write(serialized_data)
with open("person_data.bin", "rb") as f:data_from_file = f.read()received_person.ParseFromString(data_from_file)

优势

  1. 高效性:Protobuf 生成的字节流非常紧凑,比 JSON 或 XML 更节省空间和带宽。
  2. 跨语言支持:支持多种编程语言,包括 C++, Java, Python, Go 等,便于在不同平台和语言间传输数据。
  3. 灵活性:可以轻松地添加新字段,而不会破坏与旧版本的兼容性。
  4. 向后兼容:支持向后兼容,即使你修改了 .proto 文件,旧的代码仍然可以正常工作。

总结

Protobuf 是一种非常高效、跨平台、易于使用的序列化工具,广泛用于数据存储、RPC 和微服务通信等场景。它通过定义 .proto 文件来描述数据结构,然后使用编译器生成目标语言的代码,最后通过 SerializeToString 方法序列化数据,通过 ParseFromString 方法反序列化数据。

遇到问题

1,protoc --python_out=. person.proto 执行命令失败

原因:没有安装 protoc

解决方案:

 说明:

以上是两种方案,a和b,我用a方案可行

两个步骤

1,下载 2,解压后,移动文件

上文中描述添加到环境变量,我用的是mac,环境变量即: /usr/local/bin/

完整命令如下:

sudo mv /Users/shenke/Downloads/protoc-28.3-osx-x86_64/bin/protoc /usr/local/bin/

查看版本如下:

2, protoc --python_out=. person.proto 执行命令失败,找不到文件,路径不对

注意,命令格式 =. person.proto,等号= 后面是 点+ 空格

不用写全路径

在ter终端中运行即可

-------继续跟踪,执行如下命令均失败,当前路径,和全路径


protoc --java_out=. UserProto.proto

protoc --java_out=. /Users/shenke/suosuo/src/main/java/com/suosuo/myprojects/protobuf/UserProto.proto
 

解决方案:ter终端进入到消息文件,所在路径,再执行

protoc --java_out=. UserProto.proto,即可

3,执行生产的文件失败,

生产的python(person_pb2.py)文件失败,如下红框,爆红,无法导入goole.protobuf依赖

导入成功后,如下依赖

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

M-LAG 技术笔记

M-LAG 简介 M-LAG(Multichassis link aggregation,跨设备链路聚合)将两台物理设备在聚合层面虚拟成一台设备来实现跨设备链路聚合,从而提供设备级冗余保护和流量负载分担。 M-LAG 基础概念 如 图1-1 所示,Device A …

【政策】正文关键词提取总结

附:样本构建流程: 候选样本圈选,这一步的目的是选出潜在的高质量样本,找到一部分高难度样本,并过滤掉可能的意图不明或无意义数据。样本圈选的方法见下文。 对圈选出的样本随机抽样一小部分进行人工标注。 利用少量的…

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库,欢迎各位来进行使用与给予一些更好的建议😊 概述:该组件组件库用于提供虚拟化列表能力的组件,用于解决展示大量数据渲染时首屏渲…

特征缩放的学习

两边同时除以最大范围,除了除以最大值以外,你还可以执行所谓的均值归一化。这看起来是,你从原始特征开始,然后你重新缩放他们,使两者其中以零为中心。以前它们只有大于零的值,现在他们既有负值又有正值这通…

【大模型实战篇】vLLM的由来以及大模型部署、推理加速实践

1. 问题背景分析及vLLM的由来 大模型毫无疑问,在工作、生活中已经逐渐扮演越来越重要的角色。但大模型的尺寸一般都比较大,处理一个大模型请求的成本可能比传统关键字查询高出 10 倍。推理的成本代价较高,因此提高大模型服务系统的吞吐量&…

[JAVAEE] 网络编程

目录 一. 什么是socket套接字 二. socket套接字 2.1 socket套接字根据传输层协议分类 2.2 TCP流套接字 UDP数据报套接字主要特点 三. UDP数据报套接字编程 3.1 DatagramSocket 是UDP socket, 用于发送和接受数据报 3.2 DatagramPacket 是UDP socket 发送和接收的数据报 …

SDF,一个从1978年运行至今的公共Unix Shell

关于SDF 最近发现了一个很古老的公共Unix Shell服务器,这个项目从1978年运行至今,如果对操作系统,对Unix感兴趣,可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…

物联网低功耗广域网LoRa开发(二):LoRa开发环境搭建及驱动移植

一、STM32CubeMX加载固件库 将F0固件库添加进来 二、IAR介绍、安装及快捷操作 (一)IAR介绍 1、简介 C/C编译器和调试器 集成开发环境(IDE) 实时操作系统和中间件 开发套件 硬件仿真器以及状态机建模工具2、IAR与Keil对比 MDK默认只创建工程&#xf…

RK3568平台开发系列讲解(设备树篇)device_node 转换成 platform_device

🚀返回专栏总目录 文章目录 一、DTB转换规则二、转换源码分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树 device_node 转换成 platform_device 一、DTB转换规则 device 部分是用 platform_device 结构体来描述硬件资源的, 所以内核最终会…

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中,脚本的执行是不可避免的需求之一,而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本,但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…

基于Java Springboot鲜花商城系统

一、作品包含 源码数据库设计文档PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库:MySQL8.0 …

413: Quick Sort

解法&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e55; int a[N]; int n;int main(int argc, char** argv) {cin>>n;for (int i0;i<n;i) cin>>a[i];sort(a,an);for (int i0;i<n;i) cout<<a[i]<<" "…

通过轻易云高效实现ERP数据无缝传输

高效集成领星ERP数据至金蝶云星空 领星ERP数据集成到金蝶云星空&#xff1a;发货结算报告对接销售出库单&#xff08;日本站&#xff09; 在企业的日常运营中&#xff0c;数据的高效流动和准确处理至关重要。本文将分享一个实际运行的系统对接集成案例&#xff1a;如何将领星E…

在 WSL2 Ubuntu22.04环境安装 MySQL

一、安装步骤 1.1. 确保/etc/apt/sources.list源配置文件一切正常 sudo nano /etc/apt/sources.list需要包括以下内容 deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ focal main restricted…

通信塔台、网点、线路数据

通信塔台&#xff1a; 数量&#xff1a; 通信电缆&#xff1a; 通信网点&#xff1a;

C#桌面应用制作计算器

C#桌面应用制作简易计算器&#xff0c;可实现数字之间的加减乘除、AC按键清屏、Del按键清除末尾数字、/-按键取数字相反数、%按键使数字缩小100倍、按键显示运算结果等...... 页面实现效果 功能实现 布局 计算器主体使用Panel容器&#xff0c;然后将button控件排列放置Pane…

【C++进阶】C++11 -- 智能指针

【C进阶】C11 -- 智能指针 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4. 智能指针的原…

web——upload-labs——第一关

今天新开一个upload-labs的靶场&#xff0c;文件上传&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff01; 先讲讲文件上传 文件上传&#xff1a;在Web开发中&#xff0c;文件上传功能是一个允许用户将文件&#xff08;例如图片、文档&#xff09;上传到服务器…

提升企业库存管理效率:聚水潭与金蝶云星空集成方案

查询聚水潭库存生成金蝶物料盘点作业 在企业的日常运营中&#xff0c;库存管理和物料盘点是至关重要的环节。为了实现高效、准确的数据对接&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将聚水潭的库存数据无缝集成到金蝶云星空系统中。本案例将详细介绍如何通过API接…

MacOS下,如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能

MacOS下&#xff0c;如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能 在Mac上的Safari浏览器中&#xff0c;可以通过实况文本功能来实现图片中的文本翻译。关闭步骤具体步骤如下&#xff1a; 在浏览器地址栏&#xff0c;鼠标右击翻译按钮&#xff0c;然后点击“首选…