Protobuf.js 深入全面讲解教程

news2024/9/18 22:10:09

Protobuf.js 是一个纯JavaScript实现,支持Node.js和浏览器的TypeScript库,用于处理Google的Protocol Buffers(简称Protobuf)编码的数据。它提供了高效、可读性强且易于集成的序列化解决方案。本文将详细介绍Protobuf.js的API、核心功能、安装方法、代码示例以及应用场景。

1. Protobuf.js简介

Protobuf是由Google开发的一种数据序列化协议,类似于XML或JSON,但更小、更快、更简单。它可以定义数据结构,并生成能够在多种编程语言中使用的代码,使得应用程序之间可以轻松地交换结构化数据。Protobuf.js将这种强大功能引入了JavaScript世界,支持在浏览器和Node.js环境下编译和解析Protobuf消息。

2. 安装与配置

2.1 安装Protobuf.js

你可以通过npm来安装Protobuf.js。打开终端,运行以下命令:

npm install protobufjs

2.2 依赖项

Protobuf.js 依赖 long.js 和 bytebuffer.js。这些依赖项在安装Protobuf.js时会自动安装。

3. 定义.proto文件

在使用Protobuf.js之前,你需要定义一个或多个.proto文件来描述数据结构。例如:

syntax = "proto3";

package ns;

message Login {
    string username = 1;
    string password = 2;
}

message Address {
    string province = 1;
    string city = 2;
    string country = 3;
}

4. 核心API

Protobuf.js提供了丰富的API来处理.proto文件、构建Message类以及编解码数据。

4.1 Root类

Root类是Protobuf.js的核心,用于管理所有通过.proto文件定义的消息类型。

const protobuf = require("protobufjs");

// 从JSON加载.proto文件
const json = require("path/to/msg.json"); // 假设msg.json是由.proto文件转换而来
const root = protobuf.Root.fromJSON(json);

// 从.proto文件直接加载
// protobuf.load("path/to/msg.proto", function(err, root) {
//     if (err) throw err;
//     // 使用root...
// });

4.2 Message类

Message类用于表示.proto文件中定义的消息类型。

const Login = root.lookupType("ns.Login");

// 创建并初始化Login消息
const login = Login.create({
    username: "user123",
    password: "pass456"
});

// 序列化消息为二进制数据
const buffer = Login.encode(login).finish();

// 反序列化二进制数据为消息对象
const decodedLogin = Login.decode(buffer);
console.log(decodedLogin); // 输出:Login { username: 'user123', password: 'pass456' }

4.3 编解码函数

Protobuf.js提供了encodedecode函数来进行消息的序列化和反序列化。

  • encode(message: Message|Object[, writer: Writer]): Writer:将消息实例或有效的纯JavaScript对象编码为二进制数据。
  • decode(reader: Reader|Uint8Array): Message:将缓冲区解码为消息实例。

5. 命令行工具pbjs

Protobuf.js提供了一个命令行工具pbjs,用于在文件格式之间转换并可以生成静态代码。

5.1 转换.proto文件

将.proto文件转换为.json文件:

./node_modules/protobufjs/bin/pbjs -t json msg.proto > msg.json

将.proto文件转换为.js文件:

./node_modules/protobufjs/bin/pbjs -t static_module -w commonjs -o msg.js msg.proto

5.2 命令行选项

  • -t, --target:指定目标格式(如json, static_module等)。
  • -p, --path:将某个目录添加到包含路径中。
  • -o, --out:保存文件而非写入到标准输出。

6. 应用场景

Protobuf.js适用于多种应用场景,包括但不限于:

  • 网络通信:在前后端之间进行高效的数据交换,尤其适合微服务架构。
  • 数据存储:格式化存储,易于解析和检索。
  • 实时通信:结合WebSocket或其他实时通信协议中的数据编码。
  • 客户端应用:减少JSON带来的大小开销,提高数据加载速度。

7. 总结

Protobuf.js是一个功能强大、易于使用的库,为JavaScript和浏览器环境提供了对Google Protocol Buffers的支持。通过本文的讲解,你应该对Protobuf.js有了全面的了解,包括如何安装配置、定义数据结构、使用API进行编解码以及命令行工具的使用。希望这能帮助你在实际项目中更好地利用Protobuf.js提升开发效率和数据交换性能。

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

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

相关文章

springboot+mybatis+mysql仿百度网盘系统2.0

springbootmybatismysql仿百度网盘系统2.0 一、系统介绍二、功能展示1.用户登陆2.主页3.全部文件4.文件上传5.文件分享6.文件分类 三、其它1.其他系统实现 一、系统介绍 系统主要功能: 普通用户:用户登陆、主页、全部文件、上传文件、文件分类、文件分部…

初始爬虫6

数据提取 数据提取总结 响应分类 结构化 json数据(高频出现) json模块 jsonpath模块 xml数据(低频出现) re模块 …

AJAX 入门 day3

目录 1.XMLHttpRequest 1.1 XMLHttpRequest认识 1.2 用ajax发送请求 1.3 案例 1.4 XMLHttpRequest - 查询参数 1.5 XMLHttpRequest - 数据提交 2.Promise 2.1 Promise认识 2.2 Promise - 三种状态 2.3 案例 3.封装简易版 axios 3.1 封装_简易axios_获取省份列表 3…

TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错

目录 1,前言2,二者关系2.1,使用 3,遇到的问题3.1,TS 中使用 JS 1,前言 通过 Vite 创建的 Vue3 TS 项目,根目录下会有 tsconfig.json 和 tsconfig.node.json 文件,并且存在引用关系…

【云原生监控】Prometheus之PushGateway

Prometheus之PushGateway 文章目录 Prometheus之PushGateway介绍作用资源列表基础环境一、部署PushGateway1.1、下载软件包1.2、解压软件包1.3、编辑配置systemctl启动文件1.4、创建日志目录1.5、加载并启动1.6、监控端口1.7、访问PushGateway 二、 配置Prometheus抓取PushGate…

超声波测距

基本原理:超声波测距是通过发射超声波到物体表面再反射回来,通过测量声波传播的时间来计算距离的方法。 公式解释: ( L C \times T ) ( L ):距离(从发射头到接收头的总距离)( C ):声波的传播速…

汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用

背景 近日,有网友咨询汉王手写签批控件是否可以通过allWebPlugin中间件技术加载到谷歌、火狐、Edge等浏览器?为此,笔者详细了解了一下汉王手写签批控件,它是一个标准的ActiveX控件,曾经主要在IE浏览器使用,…

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖? 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存:单例池,经历过完整bean生命,单例Bean对象2.2 二级缓存:提前暴露的Bean2.3 三级缓存:打破循环 3. S…

【CMake】使用CMake在Visual Studio 构建多cpp文件项目

首先,我们在 C m a k e Cmake Cmake文件下写入以下代码: #需求的最低cmake程序版本 cmake_minimum_required(VERSION 3.12)#本工程的名字 project(OpenGL)#支持的C版本 set(CMAKE_CXX_STANDARD 20)#本工程主程序文件及输出程序名称,生成exe …

TriangleIcon 鸿蒙ArkTS自定义View 实现带颜色的上下箭头

TriangleIcon 鸿蒙ArkTS自定义View 实现带颜色的上下箭头 最近将公司项目中VUE实现的的一个数据看板模块进行了纯血鸿蒙的实现,里面有个效果就是 数据指标上升 一个绿色箭头朝上,数据指标下降一个红色箭头向下 具体的效果可以查看上图, 其中V…

Vue3 项目实战甄选硅谷

1.技术选型 2.搭建Vue3 项目使用pnpm 1.安装pnpm pnpm安装 npm i -g pnpm 2.项目初始化 pnpm create vite cd ./project pnpm i pnpm run dev 初始化完成 3.项目开始之前先对项目进行一些配置 1.想让刚启动项目浏览器自动打开 找到 2.eslint配置 1.安装eslint pnpm…

FloodFill(洪水灌溉)算法专题——DFS深搜篇

1、图像渲染 . - 力扣(LeetCode) 1.1 算法原理 从(sr,sc)位置开始上下左右暴搜,将区域中符合条件的值修改为color。细节问题:当 color image[sr][sc]时,不需修改,直接返回即可。 1.2 算法代码 class Sol…

C++初阶:STL详解(三)——vector的介绍和使用

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C:由浅入深篇 小新的主页:编程版小新-CSDN博客 前言: 前面我们刚刚了解了strin…

STM32外设之LTDC/DMA2D—液晶显示(野火)

文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么,有几种屏,有什么组成。 怎么控制,不同屏幕控…

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解 1.FastGPT快速使用:基本设置、核心模块讲解 1.1 知识库设置 首先我们需要创建一个知识库。 知识库创建完之后我们需要上传一点内容。 上传内容这里有四种模式: 手动输入:手动输入问…

php部署到apach服务器上遇到的问题

php部署到apach服务器上遇到的问题 问题描述解决方案 问题描述 参考环境搭建文章: 链接: Windows本地搭建PHP环境 第六步的第二条中出现无法正常访问http://localhost:8888/index.php的情况。 解决方案 思路:之前的http://localhost:8888是可以正常访…

收购芯片设计公司Annapurna Labs后

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Linux-mysql5.7-mysql8.0安装包下载及安装教程,二合一

一、安装包下载 1、手动下载 MySQL :: Download MySQL Community Server 2、wegt下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 登录自己的liunx ,复制上面的命令下载。 二、手动安装 1、上传压缩包到…

Tomcat端口号被占用

1.当启动了Tomcat后再打开idea运行web项目下的Tomcat就会报这个“Tomcat端口号被占用”错误,解决办法就是关闭Tomcat(用tomcat文件里面的shutdown.bat关闭,也可以在exe程序里面关闭),再在idea中运行web项目下的Tomca …

华为OD机试真题-九宫格按键输入-2024年OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷D卷C卷)_华为od机试题库-CSDN博客 题目描述 九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连…