加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

protoc-gen-lua extensions正确的使用方式

发布时间:2020-12-14 21:58:00 所属栏目:大数据 来源:网络整理
导读:我们项目中的Protobuf 是这样的格式 --Student.proto message Student { required int32 id = 1; extensions 10 to max; } message Phone { required string phonenum=1; } extend Student { repeated Phone Studentphones = 10; } 用protoc-gen-lua生成之后

我们项目中的Protobuf 是这样的格式

    --Student.proto
     
    message Student
    {
      	required int32 id = 1;
     
      	extensions 10 to max;
    }
     
    message Phone
    {
    	required string phonenum=1;
    }
     
    extend Student
    {
      repeated Phone Studentphones = 10;
    }

用protoc-gen-lua生成之后如下

    --Student_pb.lua
     
    -- Generated By protoc-gen-lua Do not Edit
    local protobuf = require "protobuf"
    module('Student_pb')
     
    local STUDENT = protobuf.Descriptor();
    local STUDENT_ID_FIELD = protobuf.FieldDescriptor();
    local PHONE = protobuf.Descriptor();
    local PHONE_PHONENUM_FIELD = protobuf.FieldDescriptor();
     
    STUDENT_ID_FIELD.name = "id"
    STUDENT_ID_FIELD.full_name = ".Student.id"
    STUDENT_ID_FIELD.number = 1
    STUDENT_ID_FIELD.index = 0
    STUDENT_ID_FIELD.label = 2
    STUDENT_ID_FIELD.has_default_value = false
    STUDENT_ID_FIELD.default_value = 0
    STUDENT_ID_FIELD.type = 5
    STUDENT_ID_FIELD.cpp_type = 1
     
    STUDENT.name = "Student"
    STUDENT.full_name = ".Student"
    STUDENT.nested_types = {}
    STUDENT.enum_types = {}
    STUDENT.fields = {STUDENT_ID_FIELD}
    STUDENT.is_extendable = true
    STUDENT.extensions = {}
    PHONE_PHONENUM_FIELD.name = "phonenum"
    PHONE_PHONENUM_FIELD.full_name = ".Phone.phonenum"
    PHONE_PHONENUM_FIELD.number = 1
    PHONE_PHONENUM_FIELD.index = 0
    PHONE_PHONENUM_FIELD.label = 2
    PHONE_PHONENUM_FIELD.has_default_value = false
    PHONE_PHONENUM_FIELD.default_value = ""
    PHONE_PHONENUM_FIELD.type = 9
    PHONE_PHONENUM_FIELD.cpp_type = 9
     
    PHONE.name = "Phone"
    PHONE.full_name = ".Phone"
    PHONE.nested_types = {}
    PHONE.enum_types = {}
    PHONE.fields = {PHONE_PHONENUM_FIELD}
    PHONE.is_extendable = false
    PHONE.extensions = {}
     
    Phone = protobuf.Message(PHONE)
    Student = protobuf.Message(STUDENT)

完全没有 extensions 被注册。所以这种格式是不被支持的。

还是要按照 example 中的写

    --Person.proto
     
    message Person
    {
      required int32 id = 1;
     
      extensions 10 to max;
    }
     
    message Phone
    {
        extend Person
        {
          repeated Phone phones = 10;
        }
     
        required string phonenum=1;
    }
     
    message Course
    {
        extend Person
        {
          repeated Course course = 11;
        }
     
        required int32 courseid=1;
    }

这样生成的 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_ID_FIELD = protobuf.FieldDescriptor();
local PHONE = protobuf.Descriptor();
local PHONE_PHONENUM_FIELD = protobuf.FieldDescriptor();
local PHONE_PHONES_FIELD = protobuf.FieldDescriptor();
local COURSE = protobuf.Descriptor();
local COURSE_COURSEID_FIELD = protobuf.FieldDescriptor();
local COURSE_COURSE_FIELD = protobuf.FieldDescriptor();
 
PERSON_ID_FIELD.name = "id"
PERSON_ID_FIELD.full_name = ".Person.id"
PERSON_ID_FIELD.number = 1
PERSON_ID_FIELD.index = 0
PERSON_ID_FIELD.label = 2
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.name = "Person"
PERSON.full_name = ".Person"
PERSON.nested_types = {}
PERSON.enum_types = {}
PERSON.fields = {PERSON_ID_FIELD}
PERSON.is_extendable = true
PERSON.extensions = {}
PHONE_PHONENUM_FIELD.name = "phonenum"
PHONE_PHONENUM_FIELD.full_name = ".Phone.phonenum"
PHONE_PHONENUM_FIELD.number = 1
PHONE_PHONENUM_FIELD.index = 0
PHONE_PHONENUM_FIELD.label = 2
PHONE_PHONENUM_FIELD.has_default_value = false
PHONE_PHONENUM_FIELD.default_value = ""
PHONE_PHONENUM_FIELD.type = 9
PHONE_PHONENUM_FIELD.cpp_type = 9
 
PHONE_PHONES_FIELD.name = "phones"
PHONE_PHONES_FIELD.full_name = ".Phone.phones"
PHONE_PHONES_FIELD.number = 10
PHONE_PHONES_FIELD.index = 0
PHONE_PHONES_FIELD.label = 3
PHONE_PHONES_FIELD.has_default_value = false
PHONE_PHONES_FIELD.default_value = {}
PHONE_PHONES_FIELD.message_type = PHONE
PHONE_PHONES_FIELD.type = 11
PHONE_PHONES_FIELD.cpp_type = 10
 
PHONE.name = "Phone"
PHONE.full_name = ".Phone"
PHONE.nested_types = {}
PHONE.enum_types = {}
PHONE.fields = {PHONE_PHONENUM_FIELD}
PHONE.is_extendable = false
PHONE.extensions = {PHONE_PHONES_FIELD}
COURSE_COURSEID_FIELD.name = "courseid"
COURSE_COURSEID_FIELD.full_name = ".Course.courseid"
COURSE_COURSEID_FIELD.number = 1
COURSE_COURSEID_FIELD.index = 0
COURSE_COURSEID_FIELD.label = 2
COURSE_COURSEID_FIELD.has_default_value = false
COURSE_COURSEID_FIELD.default_value = 0
COURSE_COURSEID_FIELD.type = 5
COURSE_COURSEID_FIELD.cpp_type = 1
 
COURSE_COURSE_FIELD.name = "course"
COURSE_COURSE_FIELD.full_name = ".Course.course"
COURSE_COURSE_FIELD.number = 11
COURSE_COURSE_FIELD.index = 0
COURSE_COURSE_FIELD.label = 3
COURSE_COURSE_FIELD.has_default_value = false
COURSE_COURSE_FIELD.default_value = {}
COURSE_COURSE_FIELD.message_type = COURSE
COURSE_COURSE_FIELD.type = 11
COURSE_COURSE_FIELD.cpp_type = 10
 
COURSE.name = "Course"
COURSE.full_name = ".Course"
COURSE.nested_types = {}
COURSE.enum_types = {}
COURSE.fields = {COURSE_COURSEID_FIELD}
COURSE.is_extendable = false
COURSE.extensions = {COURSE_COURSE_FIELD}
 
Course = protobuf.Message(COURSE)
Person = protobuf.Message(PERSON)
Phone = protobuf.Message(PHONE)
 
Person.RegisterExtension(PHONE_PHONES_FIELD)
Person.RegisterExtension(COURSE_COURSE_FIELD)

注册了 Extension ,这样才能在代码中去使用 extensions 。

测试代码

    --test.lua
     
    package.path = package.path .. ';../protobuf/?.lua;../protobuf/luascript/?.lua'
    package.cpath = package.cpath .. ';../protobuf/?.so'
     
    require 'person_pb'
     
    local person= person_pb.Person()
    person.id = 1000
     
    local phone = person.Extensions[person_pb.Phone.phones]:add()
    phone.phonenum="1376795xxxx"
     
    local phone1 = person.Extensions[person_pb.Phone.phones]:add()
    phone1.phonenum="1376795xxxx-1"
     
    local course = person.Extensions[person_pb.Course.course]:add()
    course.courseid=12
     
    local data = person:SerializeToString()
     
    local msg = person_pb.Person()
     
    msg:ParseFromString(data)
    print(msg)
     
    print(table.maxn(msg.Extensions[person_pb.Phone.phones]))
    for i=1,table.maxn(msg.Extensions[person_pb.Phone.phones]),1 do
    	local phone=msg.Extensions[person_pb.Phone.phones][i]
    	print(phone.phonenum)
    end

输出

id: 1000
[phones] {
phonenum: 1376795xxxx
}
[phones] {
phonenum: 1376795xxxx-1
}
[course] {
courseid: 12
}

2
1376795xxxx
1376795xxxx-1
[Finished in 0.0s]

测试工程打包下载


http://pan.baidu.com/s/1nt5v0gD

上面的是 repeate,对应的就是 table ,单个的像下面写


    --person.proto
    message Person
    {
      required int32 id = 1;
     
      extensions 10 to max;
    }
     
    message Phone
    {
        extend Person
        {
          required Phone phones = 10;
        }
     
        required string phonenum=1;
    }

测试代码

    --test.lua
    package.path = package.path .. ';../protobuf/?.lua;../protobuf/luascript/?.lua'
    package.cpath = package.cpath .. ';../protobuf/?.so'
     
    require 'person_pb'
     
    local person= person_pb.Person()
    person.id = 1000
     
    local phone = person.Extensions[person_pb.Phone.phones]
    phone.phonenum="1376795xxxx"
     
    local data = person:SerializeToString()
     
    -------------------------------------------
     
    local msg = person_pb.Person()
     
    msg:ParseFromString(data)
    print(msg)
     
    print(msg.Extensions[person_pb.Phone.phones])

输出

[phones] {
phonenum: 1376795xxxx
}
id: 1000

phonenum: 1376795xxxx

[Finished in 0.0s]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读