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("{\n")
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(",\n")
16 end
17 io.write("}\n")
18 else
19 error("cannot serialize a " .. type(o))
20 end
21 end
 
 
 
 

Step By Step(Lua数据持久化)的更多相关文章

  1. Lua数据持久化

      1.数据文件 我们可以利用Lua中的table构造式来定义一种文件格式,即文件中的数据是table构造并初始化的代码 ,这种方式对于Lua程序而言是非常方便和清晰的,如: Entry{" ...

  2. Step By Step(C调用Lua)

    Step By Step(C调用Lua) 1. 基础:    Lua的一项重要用途就是作为一种配置语言.现在从一个简单的示例开始吧.    --这里是用Lua代码定义的窗口大小的配置信息    wid ...

  3. Step By Step(Lua输入输出库)

    Step By Step(Lua输入输出库) I/O库为文件操作提供了两种不同的模型,简单模型和完整模型.简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件.完整模型则使用 ...

  4. Step By Step(Lua元表与元方法)

    Step By Step(Lua元表与元方法) Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表 ...

  5. Step By Step(Lua数据结构)

    Step By Step(Lua数据结构) Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示.     ...

  6. Step By Step(Lua迭代器和泛型for)

    Step By Step(Lua迭代器和泛型for) 1. 迭代器与Closure:    在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都 ...

  7. Step By Step(Lua基础知识)

    Step By Step(Lua基础知识) 一.基础知识:    1. 第一个程序和函数:    在目前这个学习阶段,运行Lua程序最好的方式就是通过Lua自带的解释器程序,如:    /> l ...

  8. Step By Step(Lua开篇)

    Step By Step(Lua开篇) 一.简介: Lua作为目前最为流行的.免费轻量级嵌入式脚本语言,在很多工业级的应用程序中被广泛应用,如Adobe's Photoshop,甚至是在一些著名的游戏 ...

  9. OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解

    原文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 Title : cv::Mat depth/dims/channels ...

随机推荐

  1. aws EKS EFS storageclass PV PVC Pod

    storageclass [root@localhost specs]# cat storageclass.yaml kind: StorageClass apiVersion: storage.k8 ...

  2. 使用defineProperty实现自定义setter, 简化前端Angular的重构工作

    一.问题场景 Angular的双向绑定给我们开发提供了很大的遍历,将父scope的引用变量作为参数传递给子指令,这样就可以方便的在父作用域内进行业务操作,数据变更会自动传递到子指令.但是如果你基于一个 ...

  3. LA3905流星

    题意:       在一个二维平面上有n个流星,每个流星有自己的初始位置和速度,有一个照相机,张相机的可视范围是一个矩形框,左下角(0,0)右上角(w ,h),然后问你相机的矩形内出现的最多的流星数是 ...

  4. 关于PHP动态的接收传递的GET,POST和COOKIE变量

    0x01 我们知道 PHP 接收的变量最常用的是 GET,POST,COOKIE 这三个变量.GET变量是附在 url 后传输的,而 POST 变量是放在 http 包中传输的,COOKIE 则是浏览 ...

  5. 4.PHP正则表达式与数组

    PHP正则表达式相关 行定位符 开头 ^tm 结尾 tm$ 不限制 tm 单词定界符 \btm\b   单词tm,如果想取反的话就是大写的 \Btm\B 或的关系,[Tt][Mm] 可以表达 tm T ...

  6. Nmap 扫描器的使用技巧

    1.nmap语法 -A 全面扫描/综合扫描 例如:nmap -A 127.0.0.1 扫描指定段 例如:nmap 127.0.0.1-200&nmap 127.0.0.1/24 2.Nmap ...

  7. redis的数据结构、使用场景、持久化方式以及常见面试问题

    一.redis中的数据结构 1.字符串(String) SET key value //存入字符串键值对 MSET key value[key value...] //批量存储字符串键值对 SETNX ...

  8. CF1487 Cat Cycle

    一个规律题目要多做多积累 , 脑子不太灵活 CF1487 Cat Cycle 题目大意: 两只猫A,B, A猫从n -> n-1 -> n-2 ... -> 1 -> 2 .. ...

  9. Django(24)永久重定向和临时重定向

    重定向 重定向分为永久重定向和临时重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面.比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面. ...

  10. not full 和 default

    create table t16( id int, name char(6), sex enum('male','female') not null default 'male'); insert i ...