Step By Step(Lua数据持久化)
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 = 0
2 --这里预先定义了Entry函数,以便在执行dofile中的数据代码时,可以找到匹配的该函数。
3 function Entry() count = count + 1 end
4 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) do
11 print(name)
12 end
13
14 --输出结果为:
15 --Jerry Tian
16 --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("{ ")
9 --迭代table中的各个元素,同时递归的写出各个字段的value。
10 --由此可以看出,这个简单例子可以支持嵌套的table。
11 for k,v in pairs(o) do
12 --这样做是为了防止k中包含非法的Lua标识符。
13 io.write(" ["); serialize(k); io.write("] = ")
14 serialize(v)
15 io.write(", ")
16 end
17 io.write("} ")
18 else
19 error("cannot serialize a " .. type(o))
20 end
21 end
ios学习之UISwipeGestureRecognizer手势识别
iOS使用AVFoundation实现二维码扫描
IOS开发之Core Location
iOS中如何创建一个滑出式导航面板(1)
消息推送之百度云推送Android集成与使用方法
IOS开发之Storyboard应用
用CocoaPods做iOS程序的依赖管理
RelativeLayout 布局参数
Android中获取应用程序(包)的信息-----PackageManager的使用
- 最新文章
-
vim 编辑器简单使用总结
有向无环图的应用—AOV网 和 拓扑排序
图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)
全面分析再动手的习惯:链表的反转问题(递归和非递归方式)
哈夫曼(huffman)树和哈夫曼编码
数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型
树与森林的存储、遍历和树与森林的转换
防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
- 热门文章
-
时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
二叉树的层序遍历和二叉树的线索化
门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结
二叉树的三种遍历的应用(表达式,求深度,叶子数,结点数,二叉树的建立,复制)
斐波那契数列和反向计算问题
算法中的递归分析和分治法的原理
二叉树的存储方式以及递归和非递归的三种遍历方式
常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)
软件开发常用设计模式—单例模式总结(c++版)
进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结