LuatOS核心库API——【protobuf】PROTOBUF数据操作
在现代分布式系统与微服务架构中,高效的数据交换是性能的基石。Protocol Buffers(简称Protobuf)作为Google开源的高效数据序列化格式,凭借其体积小、解析快、跨语言的特性,已成为众多高性能应用的首选。本文将从数据操作的核心出发,详细讲解如何定义.proto结构、生成目标语言代码,并通过具体的代码示例演示对象的序列化与反序列化的完整流程,助你快速掌握这一核心技能。
一、概述
Protocol Buffers(简称 Protobuf)是一种由 Google 开发的高效、跨平台、语言无关的结构化数据序列化协议,广泛应用于网络通信、数据存储、配置管理等场景,具有体积小、解析快、扩展性强等优势。
LuatOS 提供了统一的 Protobuf 核心库(protobuf),对底层 Protobuf 编解码进行轻量级封装。开发者只需调用简洁的 API 接口,即可实现高性能的结构化数据序列化与反序列化,显著降低协议对接复杂度,提升通信效率与代码可维护性。
该库支持加载由 protoc 编译生成的二进制描述文件(.pb),提供完整的数据编码(encode)、数据解码(decode)等功能,支持 Proto2 和 Proto3 协议版本,能够根据输入的 protobuf 定义自动识别并处理相应版本的消息格式,适用于设备与云端、模块间高效数据交换等典型应用场景。
二、核心示例
1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;
2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;
protobuf(main.lua)

三、常量详解
核心库常量,顾名思义是由 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;
如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;
protobuf 库没有常量;
四、函数详解
4.1 protobuf.load(pbdata)
功能
加载 Protocol Buffers 二进制定义数据到系统中,使其可以用于后续的编码和解码操作;
注意事项
1. 同一个文件只需要加载一次,除非调用过 protobuf.clear() 清除已加载的定义;
2. 加载的数据必须是通过 protoc.exe 程序转换得到的二进制数据;
参数
pbdata

返回值
local success, bytesRead = protobuf.load(data)
有两个返回值 success、bytesRead;
success

bytesRead

示例

4.2 protobuf.clear()
功能
清除已加载的 Protocol Buffers 二进制定义数据;
注意事项
1. 清除所有定义数据后,可以通过调用 protobuf.load() 重新加载新的定义数据;
2. 清除后,任何依赖已删除类型的序列化/反序列化操作将失败;
3. 该函数总是成功执行,没有返回错误的情况;
参数
无;
返回值
该接口无返回值,只需调用该接口执行相关操作,无需处理返回结果;
如果一定要把接口调用的结果赋值给一个变量,则这个变量就是一个 nil 值;
示例

4.3 protobuf.encode(tpname, data)
功能
将符合 Protocol Buffer 消息定义的 Lua 表(table)数据,按照指定的消息类型进行序列化,生成二进制编码后的字符串;
注意事项
1. 编码前必须先使用 protobuf.load() 加载对应的 Protocol Buffer 定义数据;
2. 待编码的 table 内容必须符合 pb 文件里的定义;
3. 编码结果为二进制字符串,可能包含不可打印字符,调试时建议使用十六进制(如 :toHex())或 Base64 查看;
4. 如果编码失败,函数会返回 nil;
参数
tpname

data

返回值
local pbdata = protobuf.encode(tpname, data)
有一个返回值 pbdata;
pbdata

示例

4.4 protobuf.decode(tpname, data)
功能
将 Protocol Buffer 二进制编码的数据(字符串)按照指定的消息类型进行反序列化,还原为 Lua 表(table)结构;
注意事项
1. 在调用此接口前,必须先通过 protobuf.load() 加载对应的 Protocol Buffers 定义数据;
2. 输入数据 data 必须是有效的 protobuf 二进制编码字符串,且与 tpname 对应的消息格式兼容;
3. 解码成功后返回 Lua table,若解码失败则返回 nil;
4. Lua table 内容无法直接打印出来,建议搭配 json.encode() 查看;
参数
tpname

data

返回值
local tbdata = protobuf.decode(tpname, data)
有一个返回值 tbdata;
tbdata

示例

五、模组支持说明
支持 LuatOS 开发的所有模组都支持 protobuf 核心库。
今天的内容就分享到这里了~
更多推荐

所有评论(0)