protoBuffer
简介
protobuffer是google开发的一种数据描述语言,它能够将结构化的数据序列化,并切可以将序列化的数据进行反序列化恢复原有的数据结构。一般用于数据存储以及通信协议方面。
API说明
API接口 | 描述 |
---|---|
protobuf.encode() | 序列化接口 |
protobuf.decode() | 反序列化接口 |
实现流程
-
创建addressbook.proto文件,定义数据结构。message 关键字后跟上消息名称Person ,之后我们在其中定义了 message 具有的字段,形式为:字段规则 类型 名称 = 字段编号。
-
proto编译为pb,具体编译方法见\demo\protoBuffer\proto编译为pb方法.txt文档说明
-
注册proto描述文件
-
调用protobuf.encode()接口做数据序列化
-
调用protobuf.decode()接口做数据反序列化
示例
相关实例程序在脚本库的\demo\protoBuffer\下,这里主要是大概讲了一下主要流程,其它细节部分可以下载demo研究完整的代码。
- 注册proto描述文件
local pbFile = io.open("/lua/addressbook.pb","rb")
local pbBuf = pbFile:read("*a")
pbFile:close()
protobuf.register(pbBuf)
- 使用protobuf.encode()序列化,序列化后的二进制数据流以string类型赋值给encodeStr
local addressBook =
{
name = "Alice",
id = 12345,
phone =
{
{number = "1301234567"},
{number = "87654321", type = "WORK"},
{number = "13912345678", type = "MOBILE"},
},
email = "username@domain.com"
}
local encodeStr = protobuf.encode("tutorial.Person", addressBook)
- 使用protobuf.decode反序列化,反序列化后的数据以table类型赋值给decodeTable
decodeTable = protobuf.decode("tutorial.Person", encodeStr)
decodeTable.profile.nick_name = "AHA"
decodeTable.profile.icon = "id:1"
常见问题
- 打印不了log问题,由于这个打印比较靠前,直接打印会丢失打印不出来,可以在mail.lua中次模块之前加一个延时处理rtos.sleep(3000)。