msgpack java lua_使用lua-cmsgpack序列化和反序列化lua对象

原文在简书首发:http://www.jianshu.com/p/badf412db4e7

lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库,没有任何其它依赖,编译后可以直接被lua调用,目前主要支持Lua

5.1/5.2/5.3 版本。

1、什么是MessagePack?

-----------

官方的解释是:

```

It's like JSON.

but fast and small.

```

跟JSON及其类似,但是比JSON更快并且占用空间更小,举个官方给出的例子,直接截官方图:

a4c26d1e5885305701be709a3d33442f.png官方图

翻译官方的解释:

MessagePack是一种高效的二进制序列化格式, 它允许在多种语言(如JSON)之间交换数据,但它越来越小,

小整数被编码为单个字节,典型的短字符串除了字符串本身之外还需要一个额外的字节。

目前市面上流行的开发语言MessagePack几乎支持,官方的地址为:http://msgpack.org/Lua

MessagePack也提供了一套开源库,地址在:https://github.com/fperrad/lua-MessagePack/。

但是,作者使用的是lua-cmsgpack,至于哪个比较优异,作者还没有去比较,主要是先发现了lua-cmsgpack,后面看了下README文件,使用方法应该是差不多的,大家可以拿来参考。

2、编译lua-cmsgpack

---------

lua-cmsgpack包括官方提供的lua-MessagePack都需要自行编译,因为可能平台太多,所以官方没有为每一个平台提供编译好的版本。lua-cmsgpack的github地址为:https://github.com/antirez/lua-cmsgpack

git clone下来之后需要安装cmake工具,mac平台直接在项目目录:

```

cmake .

make

```

即可,当然需要预先安装lua,并且是5.1版本以上的。

主要说下CentOS平台下cmake可能会出现的问题,如果cmake的过程出现以下错误:

```

Could NOT find Lua51 (missing:

LUA_INCLUDE_DIR)

...

CMake Error at CMakeLists.txt:1

(cmake_minimum_required):

CMake 2.8 or higher is required.  You are

running version 2.6.4

Configuring incomplete, errors occurred!

```

出现以上错误的话,需要自行安装lua的一些依赖库,一般:

```

yum -y install lua lua-devel

```

就可以了,如果还不行,再试试下面的命令:

```

yum install ncurses-devel gcc gcc-c++ make

```

编译完成之后会生成cmsgpack.so文件,使用的时候直接require进去即可

3、lua调用例子

---------

```lua

1 local cmsgpack =

require "cmsgpack"

2

3 local tba = {1, 2,

3}

4

5 local tbb =

{

6

a = 1,

7

b = 3

8 }

9

10 local msgpack = cmsgpack.pack(tba,

tbb)

11

12 local res1, res2 =

cmsgpack.unpack(msgpack)

13

14 for k, v in pairs(res1)

do

15

print(k, v)

16 end

17

18 for i, v in pairs(res2)

do

19

print(i, v)

20 end

```

运行效果:

```

#lua test_table.lua

1

1

2

2

3

3

a

1

b

3

```

cmsgpack.pack()可以把多个lua对象序列化成一个二进制msgpack,执行反序化的时候会返回对应数量的lua对象,非常的方便。

4、结合redis存储序列化后的msgpack

---------

有趣的是redis也支持MessagePack,因此结合lua和lua-cmsgpack可以产生不错的化学反应,下面是一个简单的例子(结合OpenResty):

```lua

local cmsgpack  = require

"cmsgpack"

local redis     =

require "resty.redis"

local red

= redis:new()

local ok, err = red:connect("127.0.0.1", 6379)

if not ok then

ngx.say("failed to

connect: ", err)

return

end

local lua_table = {

a

= 1,

b

= 3

}

local msgpack = cmsgpack.pack(lua_table)

local ok, err = red:set("msg",

msgpack)

if not ok then

ngx.say("failed to

set dog: ", err)

return

end

local ret_pack  =

red:get("msg")

local ret_table = cmsgpack.unpack(ret_pack)

ngx.say(ret_table.a + ret_table.b)

```

测试返回结果:

```

4

```

在某些场合还是有不错应用场景的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle-11g 基于 NBU 的 rman 冷备份及恢复

备份恢复环境: (1).源端:SUSE Enterprise Linux 11Oracle 11g 11.2.0.3.6(RAC)(2).目标端:SUSE Enterprise Linux 11Oracle 11g 11.2.0.3.6(RAC)冷备份及恢复情形:冷备份 odsdb 集群…

全国250米DEM数据

全国250米DEM数据 DEM是数字高程模型的英文简称(Digital Elevation Model),是研究分析地形、流域、地物识别的重要原始资料。由于DEM 数据能够反映一定分辨率的局部地形特征,因此通过DEM 可提取大量的地表形态信息,可用于绘制等高线、坡度图、…

redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解

jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比:一、普通同步方式最简单和基础…

【bzoj1705】[Usaco2007 Nov]Telephone Wire 架设电话线 dp

题目描述 最近&#xff0c;Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是&#xff0c;她们要求FJ把那些老旧的电话线换成性能更好的新电话线。 新的电话线架设在已有的N(2 < N < 100,000)根电话线杆上&#xff0c; 第i根电话线杆的高度为height_i米(1 &…

Loadrunner进行HTTPS协议性能测试

1.最简单办法就是在脚本前面加上&#xff1a;web_set_sockets_option("SSL_VERSION","TLS")&#xff0c;一般能解决HTTPS协议的请求问题&#xff0c;无毒无公害&#xff0c;快速还能解决问题 2.其实对于HTTP跟HTTPS&#xff0c;只是在服务器端配置到底是走…

Linux 权限、磁盘操作命令-Linux基础环境命令学习笔记

1、创建用户和用户组 1&#xff09;用户和用户组 /etc/passwd  保存系统用户的基本信息 /etc/group    保存用户组信息 用户名&#xff1a;x&#xff1a;UID&#xff1a;GID 2&#xff09;基本命令 useradd  增加用户 groupadd  增加用户组 passwd  为用户设置密码…

java伪代码生成器_JAVA单例模式的实现伪代码

什么是单例&#xff1f;&#xff1a;其定义是单例对象的类只能允许一个实例存在单例的实现基本原理&#xff1a;1.将该类的构造方法定义为私有访问&#xff0c;不对外暴露从而使其他类不能实例化该类对象&#xff0c;只能通过该类的静态方法得到该类的唯一实例 2.在该类中定义一…

python怎么存储数据_Python:如何在类中存储数据并继承

我对课程很陌生,我已经写了一个班来做熊猫的操作。分类方法,但我不知道如何使用它们。我的班级目标:我想写一个权限类。它应该加载/写入一个json文件,并且应该能够添加更多的权限。编辑:读了一段时间后,我发现staticmethod还有一个__init__在初始化期间加载文件的。class Permi…

Eclipse手动配置svn

1、在Eclipse根目录下建一个任意文件夹&#xff08;如plugin&#xff09;&#xff0c;在该文件夹下建一个以该插件名命名的文件夹&#xff08;如SVN&#xff09;。2、将下载下的插件文件解压&#xff0c;plugins和features文件夹复制到该文件夹下&#xff08;SVN&#xff09;。…

java爬虫新浪微博_java爬虫(爬新浪新闻) 如何从零开始

爬虫通常搜索引擎处理的对象是互联网网页。首先面临的问题是&#xff1a;如何能够设计出高效的下载系统&#xff0c;以将如此海量的网页数据传送到本地&#xff0c;在本地形成互联网网页的镜像备份。网络爬虫即起此作用&#xff0c;它是搜索引擎系统中很关键也很基础的构件。爬…

Hibernate Query 的 list 和iterate方法缓存的区别

list: quert.list()方法会将从数据库查找到的数据库放到一级缓存和二级缓存,但是不能从一级和二级缓存读取数据,但是可以从二级缓存的查询缓存读取数据, iterate: quert.iterate()方法总会先查找数据表的主键,然后根据每一个主键发送对应的sql语句从数据库读取数据,它可以把数据…

java的type转化class_第七章 (类型转换)Type Convertion

第七章 Type Convertion为什么会有类型转换&#xff1f;HTTP协议中传递的任何内容都是String类型的&#xff0c;所以一旦我们在服务器上需要一个非String类型的对象&#xff0c;例如&#xff1a;int或者Date&#xff0c;那么我们就需要在收到HTTP请求的数据的时候&#xff0c;首…

CodeVS 1068-乌龟棋

原题 题目描述 Description 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。棋盘第1格是唯一 的起点&#xff0c;第N格是终点&#xff0c;游戏要求玩家控制一个乌龟棋…

java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第一次写java的小游戏想实现点击右下角的暂停 实现游戏的暂停和继续 不知道该怎么加&#xff0c;自己找了线程的内容但试了还是成功不了&#xff0c;求大佬们帮一下小白。代码有点乱&#xff0c;大佬们见谅。&#xff0c;&#xff…

乔布斯传

资料参考 http://www.ruanyifeng.com/blog/2013/03/apple_inc_and_division_of_labor.html 苹果公司与分工原理 1.乔布斯 "乔布斯买了一间不错的房子&#xff0c;但家里只有一幅帕黎思&#xff08;Maxfield Parrish&#xff09;的画作、一部百灵牌咖啡机和几把双人牌的刀子…

JAVA5000行代码什么概念_GitHub - catstiger/mvc: 一个不超过5000行代码的,快速,简单,易用的MVC框架。...

一个不超过5000行代码的&#xff0c;快速&#xff0c;简单&#xff0c;易用的MVC框架。我们的目的是&#xff1a;让MVC回归其最初的目的。因简单而快速&#xff0c;超过目前各种主流MVC。零侵入&#xff0c;零配置&#xff0c;易于测试&#xff0c;并且让开发者感觉不到MVC的存…

33 Java语言基础控制跳转语句标号

1 public class Add9 {2 public static void main(String[] args) {3 4 a:for (int i 1; i <9 ; i) { // 标号为合法的标识符5 System.out.println("\n");6 b:for (int j 1; j <i ; j) {7 8 System.o…

java 配置jmstemplate_Spring JMSTemplate 与 JMS 原生API比较

JMSUtil与Spring JmsTemplate的对比Author&#xff1a;信仰Date&#xff1a;2012-4-20未完待续&#xff0c;截止日期2012-4-20从以下几方面比较JMSUtil和Spring JmsTemplatel 对JNDI的支持l 对ConnectionFactory、Connection、Destination、Session、MessageProducer、Messag…

java微信支付必要参数_微信支付 开发账号体系各参数详解

商户在微信公众平台提交申请资料以及银行账户资料&#xff0c;资料审核通过并签约后&#xff0c;可以获得表6-4所示帐户(包含财付通的相关支付资金账户)&#xff0c;用于公众帐号支付。帐号及作用&#xff1a;appid &#xff1a;公众帐号身份的唯一标识。审核通过后&#xff0c…

MyEclipse10的正确破解方法

无法转载&#xff0c;故给出原文链接&#xff0c;以供需要者。 MyEclipse10的正确破解方法转载于:https://www.cnblogs.com/qbzf-Blog/p/6341400.html