代码改变世界

pbc实现Lua 加/解码 Google's Protocol Buffers

2013-01-21 17:26  mahisaoo  阅读(4146)  评论(0编辑  收藏  举报
先要将proto文件编译成.pb文件,然后再动态绑定实现lua protobuffer,这就需要了解云风做的pbc的项目,地址为:https://github.com/cloudwu/pbc/blob/master/binding/lua/README.md

具体的方式是,下载pbc的项目;在pbc/binding/lua下面编译出protobuf.so放在LUA_PATH下面,或者将protobuf.lua放在LUA_PATH下,就可以调用protobuf中的库方法(我没有编译通过protobuf.so)
具体的调用方法在pbc的项目中有例子说明,主要的思路是:
1. require "protobuf"
2. 注册pb文件,利用该文件decode或者encode它的protobuffer对象,见下面的例子:
   echo "package test" > test.proto
   echo "message Mytest {optional sint64 testid=1;}" >> test.proto
   protoc --descriptor_set_out test.pb test.proto
  以上方法生成了pb文件,下面的方法是用lua对pb的decode和encode过程
   pb = require "protobuf"
   protobuf.register_file("./test.pb")
   stringbuffer = pb.encode("test.Mytest",
                   {
                         testid = 10;                    })
   result = pb.encode("test.Mytest", stringbuffer)
   print("result="..result.testid)

这只是云风提供的方法之一,
lua对pb的decode和encode过程的方法之二如下:
file = io.open("./test.pb", "rb")
buffer = file:read "*a"
file:close()
  pb.register(buffer)
  stringbuffer = pb.encode("test.Mytest",
{
testid =100;
})
result = pb.decode("test.Mytest", stringbuffer)
print("result="..result.testid)
云风还提供了第三种方法,是用Lua parser,因为这种方法需要用到lua 的 Lpeg模块,暂时还没有研究这个功能,等后面再补上。