Lua 数据文件和序列化

一、数据文件

如果在 Lua 程序中可以需要用文件保存数据,并且后续使用 Lua 进行读取使用,则可以考虑将数据按照一定的格式保存,然后用 dofile 函数进行加载,这样可以让数据很方便的进行读取。

我们可以将数据按照 EntryName{} 或者 EntryName({}) 方式存储,这样一旦使用 dofile 加载,则会让数据文件解析为调用了 EntryName 函数,并且将 {} 内的内容解析为一个 table 作为一个参数传入函数。(在只有一个参数时,函数的调用携带参数是可以省略括号的)

dofile 的详细使用在下一篇文章进行分享

接下来通过完整的例子体会一下吧

数据文件的内容

Entry{"江澎涌","28",1994,
}
Entry{"小朋友","20",2000
}

加载代码

local count = 0
function Entry()count = count + 1
end
-- 内部会调用 entry
dofile("/Users/jiangpengyong/Desktop/code/Lua/lua_study_2022/9 数据文件和序列化/data.txt")
print("number of entries: " .. count)       --> number of entries: 2

数据文件中会调用 Entry 函数,并将 {} 作为入参,所以能做的事情很多,并不止局限于统计个数,也可以将数据收集,例如下面的代码,当然也可以做一些加工。

local authors = {}
function Entry(author)table.insert(authors, author)
end
-- 内部会调用 entry
dofile("/Users/jiangpengyong/Desktop/code/Lua/lua_study_2022/9 数据文件和序列化/data.txt")
for key, author in pairs(authors) doprint("key: ", key)for key, value in pairs(author) doprint(key, "--", value)end
end--> key: 	1
--> 1	--	江澎涌
--> 2	--	28
--> 3	--	1994
--> key: 	2
--> 1	--	小朋友
--> 2	--	20
--> 3	--	2000

二、序列化为数据文件

在编写一个序列化工具中,需要注意的一些小点:

  1. string 类型要注意一些需要转义的字符,可以考虑使用 string.format("%q", content),会将特殊字符转义,并且能够很好的兼容数值、nil、boolean 类型。值得一提的是浮点数的数值会使用十六进制浮点数记录,保证他的精度。
  2. 如果不考虑使用 string.format("%q", content) ,则需要使用 "" 表示字符串,则需要注意代码注入,可以考虑 [==[ .. ]==] ( = 可以是任意多个,具体可以翻阅字符串一章) 方式来表示长字符串。只是要兼容好字符串内容也存在长字符串的格式,可以使用比内容多一个 = 的方式。
  3. 保存可能存在相互嵌套,但 Lua 的 table 构造器不支持嵌套,所以需要进行处理

2-1、不嵌套保存

对于不保存嵌套的 table ,可以使用以下代码,保存后的数据文件清晰明了

function serialize(o)local t = type(o)if t == "number" or t == "string" or t == "boolean" or t == "nil" thenio.write(string.format("%q", o))elseif t == "table" thenio.write("{\n")for k, v in pairs(o) do--- 第一种:这种做法能让 key = value 的形式比较直观,但带来的缺陷是一些关键字不能兼容--io.write("  ", k, " = ")--- 第二种:可读性比较差,以 ["key"] = value 形式保存,但是可以兼容所有关键字io.write(" [")serialize(k)io.write("] = ")serialize(v)io.write(",\n")endio.write("}\n")elseerror(string.format("cannot serialize a %s", type(o)))end
end
print(serialize({ a = 12, b = 'Lua', key = 'another "one"' }))--> {
-->  ["b"] = "Lua",
-->  ["a"] = 12,
-->  ["key"] = "another \"one\"",
--> }

2-2、保存嵌套

local function basicSerialize(o)-- 对于 Lua 5.3.3 开始, %q 可以正常的显示字符串、 nil 、 数值(浮点数会使用十六进制进行保证精度)和 boolean 类型return string.format("%q", o)
endfunction save(name, value, saved)saved = saved or {}io.write(name, " = ")if type(value) == "number"or type(value) == "string"or type(value) == "boolean"or type(value) == "nil"thenio.write(basicSerialize(value), "\n")elseif type(value) == "table" thenif saved[value] thenio.write(saved[value], "\n")elsesaved[value] = nameio.write("{}\n")for k, v in pairs(value) dok = basicSerialize(k)local fname = string.format("%s[%s]", name, k)save(fname, v, saved)endendelseerror("can't save a " .. type(value))end
end
local table = {}
jiang = {}
xiao = {}
jiang[1] = xiao
xiao[1] = jiang
save("a", jiang, table)--> a = {}
--> a[1] = {}
--> a[1][1] = a

三、写在最后

Lua 项目地址:Github传送门 (如果对你有所帮助或喜欢的话,赏个star吧,码字不易,请多多支持)

如果觉得本篇博文对你有所启发或是解决了困惑,点个赞或关注我呀

公众号搜索 “江澎涌”,更多优质文章会第一时间分享与你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PHP生成MySQL数据字典

一个项目完成之后,按照需求,我需要给这个项目写设计文档,数据库字典。 设计文档到时好说,但是数据库字典可真的是有点吓到我了。 项目开始的比较急,最开始建数据库的时候没有用excel写数据库字典。 这几十张表的数据…

对象存储服务-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务,适合存储非结构化数据,如图片,音频,视频,日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…

Java基础篇——反射枚举

反射&枚举 课程目标 1. 【理解】类加载器 2. 【理解】什么是反射 3. 【掌握】获取Class对象的三种方式 4. 【掌握】反射获取构造方法并创建对象 5. 【掌握】反射获取成员变量并使用 6. 【掌握】反射获取成员方法并使用 7. 【掌握】反射综合案例 8. 【理解】枚举B友:http…

Flutter命令。

这里列表一些Flutter命令。 注:从Dart 3.0开始,不支持无声音空安全。只能建议你尝试让你的代码更新到空安全,或者是将dart降级到3.0以前。若是使用Dart 3.0之后,则下面命令中的 "--no-sound-null-safety" 都要去掉。 …

Linux---用户权限管理

权力下放 sudo工具,可以将root的权限下放到普通用户,它允许系统管理员分配给普通用户一些合理的“权力”,让他们执行一些只有超级用户或其他特许用户才能完成的任务(主要体现为命令),比如:运行…

什么是RNN(循环神经网络)

什么是RNN(循环神经网络) 循环神经网络(Recurrent Neural Network),在识别图像时,输入的每张图片都是孤立的,认出这张图片是苹果,并不会对认出下一张图片是梨造成影响。 但对语言来说,顺序是十分重要的,“…

算法leetcode|71. 简化路径(rust重拳出击)

文章目录 71. 简化路径:样例 1:样例 2:样例 3:样例 4:提示: 分析:题解:rust:go:c:python:java: 71. 简化路径:…

系统架构设计师之NoSQL数据库及其分类

系统架构设计师之NoSQL数据库及其分类

flink jira 提交开源bug

注册apache issue账号,并申请flink空间的权限后. 提问题/bug 查看已经提交的问题:

pytest结合Excel实现接口自动化

前言 我们先来回顾下之前篇章“pytest通过parametrize方法实现数据驱动实战”,主要是通过yaml文件来读取测试用例。而我们用Excel文件存放测试用例又有什么区别呢? 毫无疑问,Pytest自动化测试框架也能读取Excel文件实现数据驱动。 还记得之…

React笔记[tsx]-解决Property ‘frames‘ does not exist on type ‘Readonly<{}>‘

浏览器报错如下&#xff1a; 编辑器是这样的&#xff1a; 原因是React.Component<any>少了后面的any&#xff0c;改成这样即可&#xff1a; export class CustomFrame extends React.Component<any, any>{............ }

分布式协调服务中的几个常见算法

分布式协调服务中的几个常见算法包括: 1. 选主算法 用于从多个节点中选举出一个节点作为主节点或者领导者,常见的算法有Bully算法、Ring算法等。 2. 原子广播算法 用于向分布式系统中的所有节点广播消息,保证所有节点都可以收到消息,典型的两阶段提交协议实现了原子广播。…

MySQL 运维篇+单机多实例多版本部署初始化缺少sys库概述

说明&#xff1a;本文讲述MySQL在单机多实例多版本部署情况下初始化后缺少sys库问题方案&#xff1a;初始化数据库前建议暂时将其他实例的Default options&#xff08;/etc/my.cnf等&#xff09;重命名结论&#xff1a;初始化新实例时即使指定相关参数也有可能会受到默认参数的…

态路小课堂丨光纤合束器介绍

TARLUZ态路 随着激光应用技术的发展&#xff0c;在材料加工、空间光通讯、遥感、激光雷达和光电对抗等诸多领域都需要更高功率、质量以及亮度的激光束。在单根光纤不能达到要求时&#xff0c;就可以通过光纤合束器对单纤激光器进行组束以获得更高功率。态路通信本文简单为您介绍…

php如何持续监听redis的消息订阅

要监听Redis服务&#xff0c;可以使用PHP的redis扩展提供的subscribe方法实现。以下是一个使用PHP监听Redis的示例代码&#xff1a; <?php $redis new Redis();// 连接到Redis服务器 $redis->connect(127.0.0.1, 6379);// 订阅频道 $redis->subscribe([channel_nam…

ArcGIS Pro怎么解决道路压盖问题

在默认情况下&#xff0c;道路可能会存在低等级道路将高等级道路压盖、在道路连接处不连通的情况&#xff0c;这些问题都可以在ArcGIS Pro内解决&#xff0c;这里为大家介绍一下处理方法&#xff0c;希望能对你有所帮助。 道路分级 在符号系统内&#xff0c;选择唯一值&#x…

算法练习- 其他算法练习4

文章目录 xxx压缩报文还原符合条件的子串长度找单词叠放书籍篮球比赛跳格子2招聘 xxx 压缩报文还原 输入一个压缩后的报文&#xff0c;返回它解压后的原始报文。压缩规则&#xff1a;n[str]&#xff0c;表示方括号内部的 str 重复 n 次。 注意 n 为正整数&#xff08;0 < …

待总结博客文章

springboo安全相关: 什么是JWT&#xff1f;(细致讲解) SpringBoot集成JWT实现token验证 SpringBootJWT实现登陆token验证并存储用户信息 SpringBoot 实现 JWT token 自动续期 SpringBoot整合Oauth2实现每次访问后accessToken的有效时间延期&#xff0c;实现类似于Session的…

python35种绘图函数总结,3D、统计、流场,实用性拉满

文章目录 基础图误差线三维图等高线图场图统计图非结构坐标图 基础图 下面这8种图像一般只有两组坐标&#xff0c;直观容易理解。 函数坐标参数图形类别plotx,y曲线图stackplotx,y散点图stemx,y茎叶图scatterx,y散点图polarx,y极坐标图stepx,y步阶图barx,y条形图barhx,y横向条…

阿里云国际版注册教程

什么是阿里云国际版&#xff1f; 阿里云国际版是阿里云专为海外客户供给的服务器及核算资源&#xff0c;涵盖了云主机、弹性裸金属服务器、容器服务、数据库及安全和监控等一系列云核算解决方案。 与其他云核算服务供给商不同&#xff0c;阿里云国际版在安全性、稳定性、性能方…