使用lua解析pb格式的数据遇到的坑,终可行,最详细教程

Mac下解析pb数据的环境问题与解决

接上一篇博客:mac使用.protoc文件转换成.lua(protoc-gen-lua python3超详细教程)-CSDN博客

protoc-gen-lua插件已经可以用了,我现在要开始解析pb格式的数据。网上现成的例子全部都跑不通,通过摸索,发现都是环境的坑。

软件版本:

lua5.1

luarocks 3.9.2

lua-protobuf 0.5.2-1

protobuf 1.1.2-0

  • 首先定义一个最简单的proto文件
syntax = "proto3";

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

  • 使用protoc --lua_out=. person.proto,生成person_pb.lua文件
  • 生成的person_pb.lua文件如下:
-- Generated By protoc-gen-lua Do not Edit
local protobuf = require "protobuf"
module('person_pb')

local PERSON = protobuf.Descriptor();
local PERSON_NAME_FIELD = protobuf.FieldDescriptor();
local PERSON_ID_FIELD = protobuf.FieldDescriptor();
local PERSON_EMAIL_FIELD = protobuf.FieldDescriptor();

PERSON_NAME_FIELD.name = "name"
PERSON_NAME_FIELD.full_name = ".Person.name"
PERSON_NAME_FIELD.number = 1
PERSON_NAME_FIELD.index = 0
PERSON_NAME_FIELD.label = 1
PERSON_NAME_FIELD.has_default_value = false
PERSON_NAME_FIELD.default_value = ""
PERSON_NAME_FIELD.type = 9
PERSON_NAME_FIELD.cpp_type = 9

PERSON_ID_FIELD.name = "id"
PERSON_ID_FIELD.full_name = ".Person.id"
PERSON_ID_FIELD.number = 2
PERSON_ID_FIELD.index = 1
PERSON_ID_FIELD.label = 1
PERSON_ID_FIELD.has_default_value = false
PERSON_ID_FIELD.default_value = 0
PERSON_ID_FIELD.type = 5
PERSON_ID_FIELD.cpp_type = 1

PERSON_EMAIL_FIELD.name = "email"
PERSON_EMAIL_FIELD.full_name = ".Person.email"
PERSON_EMAIL_FIELD.number = 3
PERSON_EMAIL_FIELD.index = 2
PERSON_EMAIL_FIELD.label = 1
PERSON_EMAIL_FIELD.has_default_value = false
PERSON_EMAIL_FIELD.default_value = ""
PERSON_EMAIL_FIELD.type = 9
PERSON_EMAIL_FIELD.cpp_type = 9

PERSON.name = "Person"
PERSON.full_name = ".Person"
PERSON.nested_types = {}
PERSON.enum_types = {}
PERSON.fields = {PERSON_NAME_FIELD, PERSON_ID_FIELD, PERSON_EMAIL_FIELD}
PERSON.is_extendable = false
PERSON.extensions = {}

Person = protobuf.Message(PERSON)

  • 写了个测试的lua来转换pb格式数据
-- 加载生成的 Lua 代码
local person_pb = require "person_pb"

-- 加载 pb 库
local pb = require "pb"


-- 创建 Person 消息
local person = person_pb.Person()
person.name = "John Doe"
person.id = 123
person.email = "john.doe@example.com"

-- 序列化消息
local person_data = person:SerializeToString()

-- 解析消息
local new_person = person_pb.Person()
new_person:ParseFromString(person_data)

-- 输出解析后的数据
print("Name:", new_person.name)  -- 输出: John Doe
print("ID:", new_person.id)      -- 输出: 123
print("Email:", new_person.email)  -- 输出: john.doe@example.com
遇到的坑:

第一个报错:lua: ./person_pb.lua:6: attempt to call field 'Descriptor' (a nil value)

这个报错真是天坑,我一开始压根没有使用luarocks install protobuf,我一直以为只需要安装lua-protobuf,然后找各种解决办法,执行luarocks show lua-protobuf指令,发现我有/usr/local/lib/lua/5.1/pb.so这个文件,所以我以为需要把引用protobuf,改为引用pb,但是改为引用pb后依然会报相同错误。

第二个报错: call field 'loadfile' (a nil value)

解决办法:

使用luarocks install protobuf安装了protobuf,看到安装好的提示,显示存在一个protobuf文件后,我意识到好像有救了,这个时候lua test.lua脚本,一切正常。这里⚠️person_pb.lua文件引用的是protobuf包,而test.lua文件引用的是pb包,两者完全不是一会事。


出身寒微不是耻辱,能屈能伸方为丈夫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值