原文在简书首发: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更快并且占用空间更小,举个官方给出的例子,直接截官方图:

官方图

翻译官方的解释:

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

```

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

msgpack java lua_使用lua-cmsgpack序列化和反序列化lua对象相关推荐

  1. JAVA进阶教学之(序列化和反序列化)

    目录 1.序列化Serialize和反序列化的概念 2.序列化和反序列化的代码演示: 3.序列化多个对象(序列化集合) 4.transient关键字将部分属性不参与序列化 1.序列化Serialize ...

  2. java中的IO流之序列化与反序列化(对象数据和文件的读写交互)

    前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客 一.知识点介绍 1.什么是序列化与反序列化? 对象与磁盘的交互读写. 2.为什么要学? 2.1在之前的IO流中,都是内存与磁盘进行交互的读 ...

  3. 当Java泛型擦除遇到JSON序列化和反序列化

    当Java泛型类型擦除遇到JSON序列化和反序列化 目录 当Java泛型类型擦除遇到JSON序列化和反序列化 前言 测试 前言 -最近看到了Spring 关于 RestTemplate的源码实现又有了 ...

  4. java newtonsoft.json_Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化. 创建 ...

  5. 反序列化 对象 java_Java IO详解(六)------序列化与反序列化(对象流)

    1.什么是序列化与反序列化? 序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输).这个过程称为序列化.通俗来说就是将数据结构或对象转换 ...

  6. YUDBModel【绿色插件】-对象序列化、反序列化、对象一键增删改查

    2019独角兽企业重金招聘Python工程师标准>>> 一.YUDBModel 介绍 架构: 使用runtime和Sqlite实现NSObject扩展类YUDBModel,直接实现( ...

  7. Java 中关键字transient引出序列化与反序列化

    一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...

  8. Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/61194594 背景 记录项目中遇到的 关于 ...

  9. Java基础-序列化和反序列化

    目录 1.序列化和反序列化概述 2.序列化 3.反序列化 4.序列化多个对象 5.序列化版本号(重要) 1.序列化和反序列化概述 1.java.io.NotSerializableException ...

最新文章

  1. LeetCode 403 Frog Jump 青蛙过河 Javascirpt 解决方案
  2. Tomcat6.0.13下配置Tomcat Administration Web Application
  3. [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master
  4. unity中如何解决镜头穿透模型?
  5. 2005 打开 2010 项目经验总结
  6. 根文件系统构建(Yocto方式)
  7. python 中文处理
  8. poj2299 ( bit )
  9. 腾讯京东要建“反阿里联盟”?Python 或成 Excel 官方脚本语言;百度华为在一起 | 一周业界事
  10. 5g和芯片有什么关系
  11. 深度搜索(DFS) 和 广度搜索(BFS)
  12. sql order by 用法
  13. 软谋在线教育推荐好书(一)
  14. 《稀缺》塞德希尔·穆来纳森 / 埃尔德·沙菲尔
  15. 卜算子.咏梅 英文版
  16. Github项目精选:2021年6月优秀项目推荐
  17. 基于MSP430G2553点亮TM1637数码管
  18. Python+Vue计算机毕业设计面向轨道交通的智能服务链系统jop1x(源码+程序+LW+部署)
  19. Python线程 一
  20. 机械转行前端,半年零基础自学的心路历程

热门文章

  1. oracle判断数据出现交叉,Oracle move table分析
  2. java ios压缩图片,Java、ios图片上传
  3. 2014北科计算机原理试题答案,北科_计算机组成原理考题-A卷答案
  4. yii 引用php文件,Yii中引出php文件及插件
  5. 开机f8修复电脑步骤_电脑无法开机怎么办,8 种情况的修复方法
  6. dicom虚拟打印服务器,DICOM打印服务器软件
  7. ARIMA模型之疏系数模型
  8. 山东大学 2020级数据库系统 实验三
  9. php post 丢失,php post大量数据时发现数据丢失问题解决方法,post数据丢失_PHP教程...
  10. 分组后统计总数_大数据时代看排球:排球技术统计能告诉你什么?