HarmonyOS 鸿蒙Next中Protobuf

HarmonyOS 鸿蒙Next中Protobuf 如何在鸿蒙中使用Protobuf

4 回复

可以看一下这个库[【 @ohos/protobufjs】](https://gitcode.com/openharmony-tpc/protobuf)

  • ProtoBuf(protocol buffers) 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。,是一种灵活,高效,自动化机制的结构数据序列化方法比XML更小,更快,更为简单。

下载安装

ohpm install [@ohos](/user/ohos)/protobufjs

OpenHarmony ohpm环境配置等更多内容,请参考 如何安装OpenHarmony ohpm包

proto文件

1、按照.proto文件格式定义消息体结构,如:user.proto文件。

syntax = "proto3";

package user;
message UserLoginResponse{
   string sessionId = 1;
   string userPrivilege = 2;
   bool isTokenType = 3;
   int64 formatTimestamp = 5;
   bytes data =6;
}

2、生成js和.d.ts文件

全局安装protobufjs
npm install -g protobufjs@7.2.4
全局安装protobufjs-cli
npm install -g protobufjs-cli

在.proto文件目录下执行下列命令
pbjs -t static-module -w es6 -o user.js user.proto
pbts user.js  -o user.d.ts

更多关于HarmonyOS 鸿蒙Next中Protobuf的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


ohpm install [@ohos](/user/ohos)/protobufjs

本项目主要是OpenHarmony系统下以protobuf.js 7.2.4为主要依赖开发,主要接口针对OpenHarmony系统进行合理的适配研发。

proto编码

import { user } from './user.js'

 let msg = user.UserLoginResponse.create({
     sessionId: "testSynchronouslyLoadProtoFile",
     userPrivilege: "John123",
     isTokenType: false,
     formatTimestamp: "12342222"
 });

 let arrayBuffer: Uint8Array = user.UserLoginResponse.encode(msg).finish()

参考地址

[https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fprotobufjs](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fprotobufjs)

鸿蒙Next中Protobuf是一种高效的数据序列化协议,用于结构化数据的序列化与反序列化。鸿蒙系统提供了对Protobuf的原生支持,开发者可通过ArkTS/ArkUI进行集成,实现跨平台数据交换。其核心在于.proto文件定义数据结构,并使用protoc编译器生成对应的ArkTS代码。在鸿蒙应用中,主要用于网络通信、本地数据持久化等场景,以提高数据传输效率和兼容性。

在HarmonyOS Next(API 12+)中使用Protobuf,核心是集成Protobuf的运行时库,并使用protoc编译器生成对应的ArkTS/JS代码。以下是主要步骤和要点:

1. 环境准备与依赖添加

在项目的oh-package.json5文件中,添加Protobuf JS运行时库依赖。

"dependencies": {
  "@protobufjs/aspromise": "^1.1.2",
  "@protobufjs/base64": "^1.1.2",
  "@protobufjs/codegen": "^2.0.4",
  "@protobufjs/eventemitter": "^1.1.0",
  "@protobufjs/fetch": "^1.1.0",
  "@protobufjs/float": "^1.0.2",
  "@protobufjs/inquire": "^1.1.0",
  "@protobufjs/path": "^1.1.2",
  "@protobufjs/pool": "^1.1.0",
  "@protobufjs/utf8": "^1.1.0",
  "@protobufjs/pbjs": "~7.3.0", // 用于生成静态代码
  "protobufjs": "~7.3.0" // 核心库
}

更简洁的方式是直接安装protobufjs,它通常会包含所需子包。也可考虑使用google-protobuf(官方JS版本)。

2. 定义.proto文件

在项目目录(如resources/proto)中创建你的协议文件,例如message.proto

syntax = "proto3";
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

3. 生成ArkTS/JS代码

使用pbjs命令行工具将.proto文件转换为ArkTS/JS可用的静态模块或JSON描述符。

  • 生成静态模块(推荐):生成独立的.ts.js文件,性能更好。
npx pbjs -t static-module -w commonjs -o ./resources/proto/message.js ./resources/proto/message.proto

生成的message.js可直接导入使用。

  • 生成JSON描述符:生成JSON格式的描述文件,运行时动态加载。
npx pbjs -t json ./resources/proto/message.proto > ./resources/proto/message.json

4. 在ArkTS/JS中使用

  • 静态模块方式
// 导入生成的静态模块
import { Person } from '../resources/proto/message';

// 创建消息并序列化
let person = Person.create({ name: "Alice", id: 123, email: "alice@example.com" });
let buffer = Person.encode(person).finish(); // 得到Uint8Array

// 反序列化
let decodedPerson = Person.decode(buffer);
console.log(decodedPerson.name); // 输出: Alice
  • JSON描述符方式(动态加载)
import protobuf from 'protobufjs';

// 加载JSON描述符
let root = await protobuf.load('../resources/proto/message.json');
let Person = root.lookupType('Person');

// 使用方式与静态模块类似
let message = Person.create({ name: "Bob", id: 456 });
let buffer = Person.encode(message).finish();
let decoded = Person.decode(buffer);

5. 序列化数据传递

序列化后的Uint8Array可用于@ohos.rpc跨进程通信、@ohos.net.socket网络传输或本地文件存储。

关键注意事项

  • 模块系统:HarmonyOS Next使用ES模块,确保生成的代码模块格式(如-w commonjs)与项目兼容,必要时调整构建配置。
  • 类型安全:使用静态模块方式能获得更好的TypeScript/ArkTS类型支持。
  • 性能:对于高性能场景,静态模块比动态加载JSON描述符更优。
  • 包大小:仅导入实际需要的.proto文件对应的生成代码,避免不必要的库体积增加。

这种方案不依赖Native API,完全在ArkTS/JS层实现,是当前HarmonyOS Next应用集成Protobuf的通用方法。

回到顶部