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. 实战项目部署应用到kubernetes流程(jenkins+docker+k8s)

    说明 通过jenkins构建java应用程序发布到k8s集群中 本文已一个大数据的java项目来演示构建部署过程 支持发布和回滚 支持一套模板应用不同项目 k8s基础准备 创建项目名称空间 [root ...

  2. composer PSR规范

    什么是PSR PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准. PHP FI ...

  3. 织梦seo

    建站-->采集文章-->sitemap-->robots->百度提交链接(主推和自动结合)-->后续优化 http://jingyan.baidu.com/article ...

  4. hdu4118

    题意:       给你一颗无向带权树,每个定点上有一个人,问所有定点都不在自己位置上的最长路径总和是多少..   思路:       其实很简单,贪心的想下,既然要求全局最大,那么对于每一条边用的次 ...

  5. 病毒木马查杀实战第013篇:一个基于.NET的“敲竹杠”病毒研究

    前言 恶意程序发展至今,其功能已经从最初的单纯破坏,不断发展为隐私的窥探,信息的盗取,乃至如今非常流行的"敲竹杠"病毒,用于勒索.可见随着时代的发展,病毒的作者们往往也是想利用自己 ...

  6. 洛谷P1422 小玉家的电费

    题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了.小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0. ...

  7. Windbg 字符串条件断点

    0x01 前言 Windbg 作为 Windows 下的主流调试器,除了人机交互相比其他调试器略有不足外,其他功能都是十分强大的存在. 在所有的调试器中断点功能都是必不可少的,Windbg 可以使用 ...

  8. HTTP自定义Header-(SOCKET-TCP)

      HTTP自定义Header-TCP 前几天弄一些东西,需要在发送http请求的时候自定义http头,找了几个库用着很不爽.有的把Cookie直接干掉了,还自己在头里加了版权,最后终于忍不了了.在网 ...

  9. Portswigger web security academy:Cross-origin resource sharing (CORS)

    Portswigger web security academy:Cross-origin resource sharing (CORS) 目录 Portswigger web security ac ...

  10. 10.qml-组件、Loader、Component介绍

    1.组件介绍 一个组件通常由一个qml文件定义(单独文件定义组件), 实际也可以在qml里面通过Component对象来嵌入式定义组件 (4小节讲解). Component对象封装的内容默认不会显示, ...