博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Step By Step(Lua数据持久化)
阅读量:4110 次
发布时间:2019-05-25

本文共 2073 字,大约阅读时间需要 6 分钟。

1. 数据文件:

    我们可以利用Lua中table的构造式来定义一种文件格式,即文件中的数据是table构造并初始化的代码,这种方式对于Lua程序而言是非常方便和清晰的,如:
    Entry { "Stephen Liu", "Male", "Programmer", "BS" }
    Entry { "Jerry Tian", "Male", "Programmer", "BS" }
    需要注意的是,Entry{<code>}等价于Entry({<code>}),对于上面的数据条目,如果我们能够定义一个合适的Entry函数,就可以让这些数据成为我们Lua代码的一部分了。见如下代码及其注释:

1 local count = 02 --这里预先定义了Entry函数,以便在执行dofile中的数据代码时,可以找到匹配的该函数。3 function Entry() count = count + 1 end4 dofile("d:/lua_data.conf")5 print("number of entries: " .. count)6 7 --输出结果为:8 --number of entries: 2

    相比于上面数据文件的格式,我们还可以定义一种更为清晰的“自描述的数据”格式,其中每项数据都伴随一个表示其含义的简短描述。采用这样的格式,即便今后数据项发生了变化,我们仍然可以在改动极小的情况下保持向后的兼容性。见如下数据格式和相关的代码:

    Entry { name = "Stephen Liu", gender = "Male", job = "Programmer", education = "BS" }
    Entry { name = "Jerry Tian", gender = "Male", job = "Programmer", education = "BS" }

1 local personInfo = {} 2 function Entry(b)  3     --这里将table对象b的name字段值作为personInfo的key信息。 4     if b.name then 5         personInfo[b.name] = true  6     end 7 end 8  9 dofile("d:/lua_data.conf")10 for name in pairs(personInfo) do11     print(name)12 end13 14 --输出结果为:15 --Jerry Tian16 --Stephen Liu

    可以看出这些代码片段都采用了事件驱动的做法。Entry函数作为一个回调函数,在执行dofile时为数据文件中的每个条目所调用。

    Lua不仅运行速度快,而且编译速度也快。这主要是因为Lua在设计之初就将数据描述作为Lua的主要应用之一所致。
    
    2. 序列化:
    相信有Java或C#开发经验的人对于这一术语并不陌生。就是将数据对象转换为字节流后在通过IO输出到文件或网络,读取的时候再将这些数据重新构造为与原始对象具有相同值的新对象。或者我们也可以将一段可执行的Lua代码作为序列化后的数据格式。比如:varname = <expr>,这里的<expr>表示计算变量varname的表达式。下面的示例代码用于序列化无环的table:

1 function serialize(o) 2     if type(o) == "number" then 3         io.write(o) 4     elseif type(o) == "string" then 5         --string.format函数的"%q"参数可以转义字符串中的元字符。 6         io.write(string.format("%q",o))  7     elseif type(o) == "table" then 8         io.write("{\n") 9         --迭代table中的各个元素,同时递归的写出各个字段的value。10         --由此可以看出,这个简单例子可以支持嵌套的table。11         for k,v in pairs(o) do12             --这样做是为了防止k中包含非法的Lua标识符。13             io.write(" ["); serialize(k); io.write("] = ")14             serialize(v)15             io.write(",\n")16         end17         io.write("}\n")18     else19         error("cannot serialize a " .. type(o))20     end21 end

转载地址:http://xmosi.baihongyu.com/

你可能感兴趣的文章
Struts2技术内幕图书 转载
查看>>
Java异常分类
查看>>
项目中的jackson与json-lib使用比较
查看>>
Jackson Tree Model Example
查看>>
j2ee-验证码
查看>>
日志框架logj的使用
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>