转自: http://www.voidcn.com/article/p-vmuovdgn-bam.html

(1)lua实现protobuf的简介

需要读者对google的protobuf有一定的了解。
Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.   https://developers.google.com/protocol-buffers/docs/overview
 

但遗憾的是,官网的probocol buffers并不支持lua,云风大侠做的pbc的项目,地址为:https://github.com/cloudwu/pbc/blob/master/binding/lua/README.md. 实现了protobuf对lua的支持。

主要步骤如下:

第一步: You specify how you want the information you're serializing to be structured by defining protocol buffer message types in .proto files(定义.proto)

第二步: Once you've defined your messages, you run the protocol buffer compiler for your application's language on your .proto file to generate data access classes.(编译.proto文件,生成.pb文件)

第三步: 使用pbc库提供的函数,实现protobuf.

(2)安装protobuf

下载地址:https://code.google.com/p/protobuf/

安装protobuf后,protobuf提供了protoc指令,可以编译.proto文件

#protobuf
cd $WORKDIR
tar xfz protobuf-2.4.1.tar.gz
cd protobuf-2.4.1
./configure || exit $?
make -j3 || exit $?
make install || exit $?

使用方法:protoc --descriptor_set_out test.pb test.proto

使用protoc -h 可以查看protoc的其他选项

把 多个proto 文件编译到一个.pb文件的方法: protoc --descriptor_set_out=$confdir/common.cmd.pb  $protodir/*.proto

(3) 安装pbc

rm -rf pbc-master
tar xfz pbc-master.tar.gz cd pbc-master
make || exit $?
cd binding/lua/ && make || exit $?
cp -rf protobuf.so $WORKDIR/lualib/

把编译生成的protobu.so文件放到LUA_PATH目录里面,当require "protobuf"的时候,可以找到这个文件。放在哪里不重要,重要的是让lua找到它。

除此之外,还有一步非常重要:

把 pbc/binding/lua/protobuf.lua 赋值到LUA_PATH目录中,当require "protobuf"的时候,可以找到这个文件。

http://www.cnblogs.com/ghost240/p/3253092.html 这篇文章中说,

LUA_PATH下,就可以调用protobuf中的库方法 是错的!在pbc/binding/lua下面编译出protobuf.so放在LUA_PATH下面,或者将protobuf.lua放在

(4)如何使用pbc

a: 定义一个common.proto文件

	package Common;

	message accountRegister
{
optional string accountid = 1;
optional string hashedpwd = 2;
}

b:编码common.proto,生成common.pb文件

protoc --descriptor_set_out=/common.pb  common.proto

c: 初始化protobuf

require("protobuf")   特别需要注意

	-- 生成的pb文件
local pbfile ="/path/to/common.pb" local pbdesc = io.open(pbfile, "rb")
if not pbdesc then
echoError("failed to load protobuf description file:" .. pbfile)
return
end local pbbuffer = pbdesc:read("*a")
protobuf.register(pbbuffer)
pbdesc:close()

d:  编码 protobuf.encode(ptype, msg)

ptype = 'Common.accountRegister' 千万不要忘了 Common前缀

msg = {accountid = '123', hashedpwd = '123456'}  msg的声明的格式必须要和proto文件里声明的一样,否则编码不通过

e: 解码 protobuf.decode(pbtype, msgbuf) 返回msg 和err,具体的返回内容请参考pbc的文件

(转)lua protobuffer的实现的更多相关文章

  1. lua pbc

    先要将proto文件编译成.pb文件,然后再动态绑定实现lua protobuffer,这就需要了解云风做的pbc的项目,地址为:https://github.com/cloudwu/pbc/blob ...

  2. 实战:一种在http请求中使用protobuffer+nginx+lua收集打点日志的方案

    背景 app打点日志的上报和收集,是互联网公司的基本需求. 一.方案选择 1.1 protobuffer vs json 探究一种以最高效的方式上报和解析打点数据是一个系统性的问题,需要解决的子问题有 ...

  3. cocos2d-x lua 中使用protobuf并对http进行处理

    cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链 ...

  4. lua执行字节码的过程介绍

    前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...

  5. lua 学习笔记(1)

    一.lua函数赋值与函数调用         在lua中函数名也是作为一种变量出现的,即函数和所有其他值一样都是匿名的,当要使用某个函数时,需要将该函数赋值给一个变量,这样在函数块的其他地方就可以通过 ...

  6. 在redis中使用lua脚本让你的灵活性提高5个逼格

    在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...

  7. 使用Nginx+Lua代理Hadoop HA

    一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNo ...

  8. 打印Lua的Table对象

    小伙伴们再也不用为打印lua的Table对象而苦恼了, 本人曾也苦恼过,哈哈 不过今天刚完成了这个东西, 以前在网上搜过打印table的脚本,但是都感觉很不理想,于是,自己造轮子了~ 打印的效果,自己 ...

  9. lua解析赋值类型代码的过程

    我们来看看lua vm在解析下面源码并生成bytecode时的整个过程: foo = "bar" local a, b = "a", "b" ...

随机推荐

  1. Day 20: 面向对象【多态,封装,反射】字符串模块导入/内置attr /包装 /授权

    面向对象,多态: 有时一个对象会有多种表现形式,比如网站页面有个按钮, 这个按钮的设计可以不一样(单选框.多选框.圆角的点击按钮.直角的点击按钮等),尽管长的不一样,但它们都有一个共同调用方式,就是o ...

  2. 并发新构件之Exchanger:交换器

    Exchanger:JDK描述:可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchang ...

  3. linux每日命令(2):ps命令

    ps命令真是我比较常用的命令了,只是也没咋仔细研究过,最大的用处就是写代码的时候,起了多进程,就会占用多个进程,如果程序异常了,进程确没有kill掉,那么再启动程序就会报错 正常起项目 如果进程被占用 ...

  4. Mysql 查询视图出现The user specified as a definer ('root'@'%') does not exist的问题

    今天服务器Mysql版本在5.7升级到8.0+之后,部分网站(老的)访问视图出现The user specified as a definer ('root'@'%') does not exist问 ...

  5. GC线程是否为守护线程?

    GC是垃圾收集的意思,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,从而有效的防止内存泄露.要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runti ...

  6. WSGI——python-Web框架基础

    1. 简介 WSGI ​ WSGI:web服务器网关接口,这是python中定义的一个网关协议,规定了Web Server如何跟应用程序交互.可以理解为一个web应用的容器,通过它可以启动应用,进而提 ...

  7. Android Studio 安装及汉化

    { https://www.bilibili.com/video/av48649403?from=search&seid=15739157224002905777 Tool: https:// ...

  8. DOM——节点操作

    节点操作  var body = document.body; var div = document.createElement('div'); body.appendChild(div); ​ va ...

  9. TYVJ1061 Mobile Service

    P1061 Mobile Service 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那 ...

  10. NX二次开发-UFUN打开二进制STL文件函数UF_STD_open_binary_stl_file

    NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...