关闭

[置顶] 一次序列化与反序列化自有协议的经历(lua版本)

标签: lua
542人阅读 评论(0) 收藏 举报
分类:


之前写过一篇python序列化反序列化的文章(http://blog.csdn.net/q_yang1987/article/details/52194860),最近为这个协议实现了一个lua版本,用这个练手感觉对初学lua的我来说很有价值,本文记录一下这个库的实现细节:


  • 使用
使用时需要先定义Protocol协议结构:


Proto.Protocol:new出来的是protocol对象,使用的时候需要由Protocol对象生成对应的Message,比如下面的基本用法
print(message_object)也做了一些友好的输出

pack和unpack函数对应于序列化和反序列化函数,格式兼容之前介绍的python协议

  • 关于lua中的int 64

lua在实现uint64时候有一个坑,lua中只有number类型,也就是double 64,在表示UINT64的时候存在精度丢失问题,可以通过下面的代码体现

a = 2000000001 * 2000000001

print(a)

b = 4.000000004e+18

print(a==b)

> true

也就是1丢失了,http://blog.codingnow.com/2012/04/lua_int64.html云风blog里面为了应对这个问题,写了一个库,本文在实现的时候也采用了这个库https://github.com/cloudwu/lua-int64,但在接口使用上遵照云风库的接口(比如从字节初始化,int64对象之间才能进行精确的加减乘除):


实现的时候通过__index, __newindex元方法内部存储为int64,序列化以及反序列化也比较有意思:

思路就是将64位切成32位,按网络序传输,其中用到的序列化库struct是:http://www.inf.puc-rio.br/~roberto/struct/

做这个库最大的目的就是为了之后为实现lua服务器做网络底层支持,同时也作为学习lua过程的一个练手




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4923次
    • 积分:141
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类