protobufJavascrip编码解码演示

news2024/11/25 1:07:41

protobuf&Javascrip编码解码演示

start

  • 写一下 protobuf 相关知识
  • 记录在 python 环境和 js 环境中如何处理 protobuf

1. protobuf是什么?

1.1 介绍

Protocol Buffers(简称Protobuf) ,是Google出品的序列化框架,与开发语言无关,和平台无关,具有良好的可扩展性。Protobuf和所有的序列化框架一样,都可以用于数据存储、通讯协议。

Protobuf支持生成代码的语言包括Java、Python、C++、Go、JavaNano、Ruby、C#,官网地址是https://developers.google.com/protocol-buffers/。

Portobuf的序列化的结果体积要比XML、JSON小很多,XML和JSON的描述信息太多了,导致消息要大;此外Portobuf还使用了Varint编码,减少数据对空间的占用。

Portobuf序列化和反序列化速度比XML、JSON快很多,是直接把对象和字节数组做转换,而XML和JSON还需要构建成XML或者JSON对象结构。

大白话来解释就是 Portobuf 是类似 JSON 一样的数据传输格式化的格式,它的特点就是字节数组,也就是 Buffers

1.2 使用

新建一个文件 lazy_tomato.proto

// 文件名: lazy_tomato.proto

syntax="proto3";  //定义语法版本,我这里使用的是 proto3

// 定义一个对象,然后定义它包含的属性,以及属性的类型,以及属性的索引
message Person  {   
  int32 age = 1;
  string name = 2;
}  

在这里插入图片描述

这个文件需要插件处理,转换成我们对应语言的文件去使用。

python语言就需要把`lazy_tomato.proto`这个文件转换成 .py

js语言就需要把`lazy_tomato.proto`这个文件转换成 .js

ps:可以提前转换好;也可以直接读取文件然后实时处理,我这里演示就用提前转换好的效果演示)
1.2.1 python转换

python转换的话,下载工具:https://github.com/google/protobuf/releases

在这里插入图片描述

下载后解压,bin目录下有protoc.exe 软件。

可以加环境变量也可以不加,直接打开命令行窗口,然后记录一下我们的软件存放的文件目录,直接拿来调用。

# D:\lazy_tomato\protoc.exe就是我们的程序路径,直接去调用
# --version 查看版本
D:\lazy_tomato\protoc.exe --version

# --python_out 转换成python版本
# ./ 同级目录
# lazy_tomato.proto 文件名
D:\lazy_tomato\protoc.exe  --python_out=./ lazy_tomato.proto

在这里插入图片描述

在这里插入图片描述

1.2.2 js转换

之前 python 下载的软件,我看旧版本 3.20.x 的还是支持 js 的,目前的最新文档就没看到支持 js 了。

我尝试的使用旧版本3.20.x版本的也可以转换,但是在使用时不知道如何使用,也没啥文档。

百度到的也有很多其他第三方库转换,但是也都缺少文档,最终寻找很久,还是采用 npm 中最热门的库:[protobufjs](https://www.npmjs.com/package/protobufjs)

在这里插入图片描述

在这里插入图片描述

看了下这个库,在维护,周下载次数2千万左右,有官方文档,很合理。

文档说到,可以直接使用工具,即可处理静态资源,当然他也提供动态处理的方法。

# 官网推荐安转到项目中,我感觉我这个工具全局都想用,可以考虑直接安装到全局
npm install protobufjs-cli --save-dev

使用 pbjs 转换 .proto 文件

在命令行中,你可以使用 pbjs 命令将 .proto 文件转换为 JavaScript 文件。例如,要将 lazy_tomato.proto 转换为静态模块(commonjs 格式),可以使用以下命令:

pbjs -t static-module -w commonjs -o lazy_tomato.js lazy_tomato.proto

这里的参数解释如下:

  • -t static-module:指定输出类型为静态模块。
  • -w commonjs:指定包装格式为 CommonJS(适用于 Node.js)。如果你需要用于浏览器,可以使用 -w es6 或其他适当的格式。
  • -o lazy_tomato.js:指定输出文件名。
  • lazy_tomato.proto:输入的 .proto 文件。

使用生成的 JavaScript 文件

一旦你生成了 JavaScript 文件,你就可以在你的 Node.js 项目中使用它。

在这里插入图片描述

编码解码示例

const protobuf = require("protobufjs");
const $root = require('./lazy_tomato.js')

const Person = $root.Person

const message = Person.create({
  name: "John Doe",
  age: 14,
});

const buffer = Person.encode(message).finish();

console.log('buffer', buffer);

const decodedMessage = Person.decode(buffer);
console.log('decodedMessage', decodedMessage);
buffer <Buffer 08 0e 12 08 4a 6f 68 6e 20 44 6f 65>
decodedMessage Person { age: 14, name: 'John Doe' }

在这里插入图片描述

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

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

相关文章

【Go】GO语言知识总结浅析

Go语言是一种现代化的编程语言&#xff0c;由Google于2007年设计并于2009年发布。它旨在使编程变得简单、高效&#xff0c;并且可以在多核处理器上轻松构建高性能应用。Go语言的编程思想、发展历史、版本特点、运行原理、数据类型、应用场景&#xff0c;以及在web开发、网络编程…

C语言内存分配

概要 C语言的内存存储是一个复杂但非常重要的主题&#xff0c;涉及到静态内存、动态内存、指针、堆栈等多种机制&#xff0c;明白了c语言的内存分配&#xff0c;可以帮助我们更好的编程和学习c语言。 一.内存分配的类型 在C/C中内存分为5个区&#xff0c;分别为栈区、堆区、…

上海大爷惹恼韭菜不敢现身了

国庆节前股市暴涨&#xff0c;立即掀起了一股“全民炒股”热浪&#xff0c;但天不遂人愿&#xff0c;有大量韭菜散户很快就被套牢。 这与满嘴跑火车的上海大爷网红“爱在深秋”&#xff0c;曾鼓吹“A股会涨到上万点”多少有些关联。10月9日股市暴跌后&#xff0c;就不见他人影…

MySQL进阶 - SQL优化

01 插入数据 【一】insert优化&#xff1a; ① 不要一行一行插入数据&#xff0c;直接批量插入多行数据(但一个insert语句不要插入超过一千条)。 insert into 表名 (字段列表) values (xx,xx...),(xx,xx...)...&#xff1b; ② 在进行插入操作时手动提交事务&#xff0c;避免频…

【代码】集合set

哈喽大家好&#xff0c;我是学霸小羊&#xff0c;今天来讲一讲集合&#xff08;set&#xff09;。 在数学上&#xff0c;集合长这样&#xff1a; 那今天就来讲一讲编程上的集合。 集合的定义&#xff1a;把一些元素按照某些规律放在一起&#xff0c;就形成了一个集合。比如说…

PostgreSQL的学习心得和知识总结(一百五十四)|高级数据结构和算法之快速排序算法quicksort的实现及使用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

鸿蒙UI系统组件16——富文本编辑器(RichEditor)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 RichEditor是支持图文混排和文本交互式编辑的组件&#xff0c;通常用于响应用户的对…

豆包MarsCode 合伙人计划限时招募中,推广最高赢万元现金!

豆包MarsCode 合伙人计划正式上线啦&#xff01;作为官方推出的推广激励项目&#xff0c;豆包MarsCode 编程助手号召和鼓励所有用户向我们推荐新用户。 现在正式开启首轮合伙人招募&#xff0c;诚邀各位有意愿推广普及 AI 编程产品的伙伴成为我们的合伙人&#xff0c;全国限量…

【Linux】操作系统基础

1.冯诺依曼体系结构介绍 冯诺依曼体系结构如下&#xff1a; 在上图中「输⼊设备」和「输出设备」⼀般被称为计算机的外设&#xff0c;⽽「存储器」在冯 诺依曼体系结构中表示「内存」 输⼊设备⼀般包括&#xff1a;⽹卡、磁盘、键盘、触摸屏等 输出设备⼀般包括&#xff1a;…

用 logfire 提高应用的可观测性

Logfire是由 Pydantic 团队打造的平台, 还有供 app 使用的 library, 我们经常提到对应用要做 LMT(Log, Metrics, Trace), Logfire 可以用来收集、存储、分析和可视化日志数据和应用性能指标。通过集成日志和度量&#xff0c;Logfire 提供了一个统一的界面来管理应用程序和系统的…

时间序列预测(一)——线性回归(linear regression)

目录 一、原理与目的 1、线性回归基于两个的假设&#xff1a; 2、线性回归的优缺点: 3、线性回归的主要目的是&#xff1a; 二、损失函数&#xff08;loss function&#xff09; 1、平方误差损失函数&#xff08;忽略了噪声误差&#xff09; 2、均方误差损失函数 三、随…

springboot项目通过maven的profile功能实现通过不同文件夹的方式来组织不同环境配置文件

写在前面 本文看下springboot项目如何通过文件夹的方式来组织不同环境配置文件。 1&#xff1a;正文 一般的我们写springboot项目时配置文件是这个样子的&#xff1a; appliction.yaml --> 通过spring.profiles.activexxx来激活某个指定后缀的配置文件 application-evn1…

【Java学习笔记】多线程

当我们在饭店聚餐时&#xff0c;多人同时吃一道菜的时候很容易发生争抢。例如&#xff0c;上了一道好菜&#xff0c;两个人同时夹这道菜&#xff0c;一人刚伸出筷子&#xff0c;结果伸到的时候菜已经被夹走了。为了避免这种现象&#xff0c;必须等一人 夹完一口后&#xff0c;另…

【大数据技术基础 | 实验一】配置SSH免密登录

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;大数据实验一体机&#xff08;二&#xff09;SSH免密认证 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;搭建集群服务器&#xff08;二&#xff09;添加域名映射&#xff08;三&#xff…

工业物联网关-ModbusTCP

Modbus-TCP模式把网关视作Modbus从端设备&#xff0c;主端设备可以通过Modbus-TCP协议访问网关上所有终端设备。用户可以自定义多条通道&#xff0c;每条通道可以配置为TCP Server或者TCP Slave。注意&#xff0c;该模式需要指定采集通道&#xff0c;采集通道可以是串口和网口通…

51WORLD携手浙江科技大学,打造智慧校园新标杆

当前&#xff0c;国家教育数字化战略行动扎实推进&#xff0c;高等教育数字化转型步伐加快。 紧抓数字教育发展战略机遇&#xff0c;浙江科技大学联合51WORLD、正方软件股份有限公司&#xff08;简称&#xff1a;正方软件&#xff09;&#xff0c;共同研发打造浙科大孪生数智校…

为什么很多人宁愿加钱买港版,也不愿买国行 iPhone 16

最近的 iPhone 16 市场&#xff0c;真的是倒反天罡&#xff0c;攻守异形啊。 过去&#xff0c;港版 iPhone 都是性价比的次选&#xff0c;便宜个 10% 都得考虑考虑。但今年&#xff0c;港版 iPhone 16 的价格&#xff0c;反而比国行还贵。 比如&#xff0c;闲鱼上某个卖家&am…

Java消息摘要:MD5验证数据完整性、密码的加密与校验

MD5&#xff08;Message-Digest Algorithm 5&#xff09;是一种被广泛使用的密码散列函数&#xff0c;是一种不可逆的加密算法&#xff0c;该算法可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完…

【工具变量】知识产权示范城市DID(2000-2023年)

数据简介&#xff1a;为深入贯彻落实《国家知识产权战略纲要》&#xff0c;强化知识产权治理效能&#xff0c;国家知识产权局制定了《国家知识产权试点、示范城市&#xff08;城区&#xff09;评定和管理办法》&#xff0c;知识产权示范城市成为知识产权强国战略落地的城市支撑…

echarts 入门

工作中第一次碰到echarts&#xff0c;当时有大哥。二进宫没办法&#xff0c;只能搞定它。 感觉生活就是这样&#xff0c;不能解决的问题总是会反复出现。通过看视频、查资料&#xff0c;完成了工作要求。写一篇Hello World&#xff0c;进行备查。 基本使用 快速上手 <!DO…