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 输出
测试工程打包下载
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]) 输出
phonenum: 1376795xxxx [Finished in 0.0s]
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |