接上一篇博客: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包,两者完全不是一会事。
出身寒微不是耻辱,能屈能伸方为丈夫
Mac下解析pb数据的环境问题与解决
4826

被折叠的 条评论
为什么被折叠?



