首页 > 其他分享 >上手protobuf:一文掌握protobuf的使用

上手protobuf:一文掌握protobuf的使用

时间:2024-10-15 14:52:47浏览次数:8  
标签:protoc 一文 proto -- stu 上手 序列化 out protobuf

简介

上一篇文章中,我们已经了解了protobuf是什么,还有proto文件该如何编写

在本文中,将着重讲讲protobuf该怎么用

Protobuf使用教程

Protobuf是一种高效数据序列化协议,可支持多种编程语言,不同编程语言使用方法或略有差异、或有多种方法,以下主要介绍大致的、通用的使用方法

安装编译器

使用protobuf前,需先安装其编译器—protoc(下载地址可看文末)

image-20240616232211987

进入项目下载界面,根据自己的系统选择下载合适的版本,如喜欢也可下载源码自行构建

接着将其解压目录中的bin目录配置到系统环境变量内,方便全局使用

配置成功后,可以在命令行窗口(win+R调出)输入protoc --version查看protoc版本,验证是否配置成功

编译Proto

.proto文件并不能直接使用,我们需要将其编译成对应编程语言的序列化工具代码,从而进行使用

这一步,我们需要使用上方安装的protoc.proto文件进行编译,protoc是一个命令行工具,主要使用步骤就是在命令行中通过命令调用protoc对目标进行编译

具体protoc的命令,可在命令行中,通过protoc --help命令,获取其部分命令解释,主要关注如下内容:

-IPATH, --proto_path=PATH   指定搜索目录
--cpp_out=OUT_DIR           生成 C++ 源码
--csharp_out=OUT_DIR        生成 C# 源码
--java_out=OUT_DIR          生成 Java 源码
--kotlin_out=OUT_DIR        生成 Kotlin 源码
--objc_out=OUT_DIR          生成 Objective-C 源码
--php_out=OUT_DIR           生成 PHP 源码
--pyi_out=OUT_DIR           生成 python 源码
--python_out=OUT_DIR        生成 Python 源码
--ruby_out=OUT_DIR          生成 Ruby 源码
--rust_out=OUT_DIR          生成 Rust 源码
  • -IPATH--proto_path可简写为-I,等号后接一个路径,表示模块搜索路径,可以有多个
    • 当你的.proto文件比较庞大,并且在里面有import导入其它proto文件,此时就可以用该命令指定导入文件所在目录,告诉编译器该去哪搜索这些文件
  • --**_out形式的命令参数表示需要生成的目标语言源码,等号后接一个路径,表示生成文件保存的目录,**表示支持生成的编程语言

举个例子

假设我们有个名为example.proto的结构文件,大致如下:

syntax = "proto3";

message Student {
string id = 1;
string name = 2;
int32 sex = 3;
int32 age = 4;
string address = 5;
}

在当前目录打开命令行,输入如下命令:

protoc --python_out=. example.proto
  • 命令表示将example.proto编译为python代码,输出目录为.(即当前目录)

命令运行完成后,会在当前目录生成一个example_pb2.py的文件,我们可在python程序内使用它对我们的消息进行序列化和反序列化

再举个例子

我们运行protoc --version后,可以看到命令参数里支持生成的语言并没有js,如果我们想生成js文件怎么办

首先,protoc是可以生成js代码的,之所以前面的不支持,是由于一些高版本的protoc把部分编程语言的支持分化出来,单独作为插件存在,需要可自行安装搭配

  • 可以降低protoc的版本,一些较低的版本是支持--js_out的(高版本将其分化出来成插件了)
  • 如果不想降低版本
    • 如果有npm,可全局安装protoc-gen-js
    • 如果无npm,可以到protobuf-javascript项目地址手动下载js的编译器包并解压到本地,然后通过--plugin指定插件名及插件路径使用;如不想使用--plugin指定,也可直接将解压内容整个拖前面protoc的目录下
  • 也可以使用一些第三方工具,如protobufjs-cliprotobufjs

解决js支持后,即可使用下列代码生成js版本的序列化库

protoc --js_out=import_style=commonjs,binary:. example.proto
  • 上面的命令会将example.proto编译为js内可用的序列化工具代码,风格为commonjs(即使用require导入)

注意:目前尚未实现对ES6样式导入的支持。可以通过使用Browserify、webpack、Closure Compiler 或类似工具来进一步解析以支持浏览器

开始使用

生成好目标环境的编译文件后,我们即可在项目内使用protobuf来提高我们的消息传输效率

Python示例

大致代码如下:

# 从编译文件导入对应消息类
from example_pb2 import Student

# 实例化消息类
stu = Student()
# 填充数据
stu.id = "18934305"
stu.name = "路人甲"
stu.sex = 1
stu.age = 18
stu.address = "斗气大陆萧家老宅"
# 序列化为二进制数据
data = stu.SerializeToString()
# 实例化新对象
newStu = Student()
# 将二进制数据解析到新对象
newStu.ParseFromString(data)
# 输出
print(f"序列化后数据:\n{data}")
print(f"反序列化后数据:\n{newStu}")
  • 其中,example_pb2为之前example.proto编译后的产物
  • 经过测试,上面的数据stu序列化后的二进制数据大小大概为84字节,而相同数据的json格式大小为210字节

在使用上方生成的example_pb2时,我们会发现,生成的代码基本不可读,使用过程代码也没有丝毫智能提示,需要自己参照proto文件才知道需导入该Student,而具体的序列化函数还得看使用文档

我们打开example_pb2.py文件,如下:

image-20240617195016241

  • 不难看出,代码可读性是比较差的

通过官方的protoc生成的python格式代码可读性是比较差的,可能比较适合一些保密需求高或小型项目,如果我们希望提高代码可读性,可以使用betterproto生成代码

  • 首先,需要安装betterproto,使用pip安装
pip install betterproto
  • 接着使用其重新编译proto文件
protoc --python_betterproto_out=. example.proto
  • 命令运行成功后,会在当前目录生成一个example.py文件,内容大致如下:

    image-20240617195507963

  • 可以看出,代码可读性变好了很多,并且拥有更好的编写体验,大致使用代码如下:

# 从编译文件导入对应消息类
from example import Student

# 实例化消息类
stu = Student()
# 填充数据
stu.id = "18934305"
stu.name = "路人甲"
stu.sex = 1
stu.age = 18
stu.address = "斗气大陆萧家老宅"
# 序列化为二进制数据
data = bytes(stu)
# 实例化新对象
newStu = Student()
# 将二进制数据解析到新对象
newStu.parse(data)

Nodejs示例

大致代码如下:

// 导入编译文件
const proto = require('./example_pb');

// 实例化消息类
const stu = new proto.Student();
// 填充数据
stu.setId('18934305');
stu.setName('路人甲');
stu.setSex(1);
stu.setAge(18);
stu.setAddress('斗气大陆萧家老宅');
// 序列化为二进制数据
const data = stu.serializeBinary();
// 将二进制数据解析到新对象
const newStu = proto.Student.deserializeBinary(data);
// 输出
console.log(`序列化后数据:\n${data}`);
console.log(`反序列化后数据:\n${newStu}`);

以上主要举例了两种使用方法,更多的使用方法可自行探索

protoc下载地址:https://github.com/protocolbuffers/protobuf/releases

protoc编译js文档:https://protobuf.dev/protobuf-javascript/

protoc编译js插件下载地址:https://github.com/protocolbuffers/protobuf-javascript/releases

标签:protoc,一文,proto,--,stu,上手,序列化,out,protobuf
From: https://www.cnblogs.com/skmcj/p/18467463

相关文章

  • 一文搞懂 URI 和 URL
    文章目录前言URIURI通用组成部分URLURL的常见定义格式方案(scheme)权威(authority)主机名(Host)端口号(Port)路径(Path)查询参数(Query)片段(Fragment)URNURN的基本结构特点用途三者的区别和联系前言在日常中我们打开浏览器访问网站时需要输入网址,如:http://127.0.0.1:8......
  • AI生成论文软件的工作原理是什么?有哪些应用和前景?一文全知道!
    在当今信息爆炸的时代,快速获取高质量的文章和论文内容成为了许多人的需求。而AI论文生成工具作为AI技术的杰出代表,为我们提供了一种全新的解决方案。本文将以锐智AI为例深入探讨AI论文生成工具的工作原理、优势和应用前景,带您领略AI时代的灵感之门。AI论文生成工具是什么?AI......
  • 一文带你了解,2024年世界职业院校技能大赛该如何备赛
    2024年世界职业院校技能大赛(以下简称“大赛”)即将拉开帷幕,这不仅是一次展示职业院校学生专业技能的舞台,更是促进国际职业教育交流与合作的重要契机。为了确保参赛队伍能在比赛中取得优异成绩,以下是一些具体建议,旨在帮助团队深入理解比赛、加强团队协作、提升个人与团队绩效......
  • 【软件考试】一文学会原码,反码与补码
    文章目录三码互转十进制数转二进制三码互转在计算机中,数值通常以二进制形式表示,原码、反码和补码是三种不同的表示方法。一、原码概念:原码是最直观的二进制表示法,最高位为符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,对于8位二进制数,+5的原码是......
  • 一文为你解读MySQL8.0 Instant DDL源码实现
    一、背景介绍数据库中每一行数据都被持久化存储在磁盘中。当我们对表进行ADD/DROPCOLUMN操作时,磁盘中的数据也会相应地被修改,所需时间与对应表的大小成正比。因此,对大表进行ADD/DROPCOLUMN操作时,花费的时间可能长达数小时或数天,这给用户的业务带来了诸多不便。MySQL5.5版本......
  • 入行网络安全需要学习哪些知识点?白帽子佬都给你汇总在这里,一文全懂_网络安全入门应该
    都说IT互联网行业吃香,那么如何才能高效入行,习得一技之长换取心仪offer?一般来说,0基础小白想入行到网络安全行业,按照如下学习逻辑肯定是错不了的:一、基础知识掌握1、计算机基础知识:理解计算机体系结构、操作系统、网络通信等基础知识,这是进入网络安全领域的基础。2、网络......
  • Vue2用户中心页面开发教程:从零开始,用HTML、CSS和Vue构建新手友好的个人中心页面,提供完
    效果图:使用Vue.js构建用户中心页面:从零到实现在本教程中,我们将使用Vue.js构建一个用户中心页面,这是一个常见的Web应用页面。我们将涵盖页面的布局、样式,以及Vue的基本数据绑定和事件处理功能。这是一个为前端新手量身定制的项目,通过此项目可以了解如何快速构建用户友好......
  • 到底大模型有什么用呢?一文了解什么是大模型?
    大模型是指具有大规模参数和复杂计算结构的机器学习模型。本文从大模型的基本概念出发,对大模型领域容易混淆的相关概念进行区分,并就大模型的发展历程、特点和分类、泛化与微调进行了详细解读,供大家在了解大模型基本知识的过程中起到一定参考作用。本文目录如下:1、大模型......
  • AI绘画SD零基础入门到精通教程,新手小白AI扫盲教程,一文搞懂MIdjourney和StableDiffusio
    大家好,我是强哥Midjourney是目前全网最强大的AI绘画平台,用户只需要简单地输入关键词描述,就能获得多幅风格各异的绘画作品,无需任何专业的绘画技能,即刻拥有让人惊叹的艺术创造力。在MidjourneyV5版本之前,用户可以享受免费使用额度,只需要注册一个账户即可在线体验AI绘画。......
  • Python 中快速上手机器学习的基础算法
    机器学习作为一种让计算机从数据中自动学习的技术,在近年来得到了迅猛发展。本文将介绍几种基础的机器学习算法,并通过Python代码示例展示它们的应用。1.什么是机器学习机器学习是一种让计算机学会从数据中自动“学习”并做出预测或决策的技术。不需要显式地编程告诉计算机......