优雅的LUA数据记录方法-serpent序列化+LUA Table

目录

  • 简述
  • 如何集成?
  • 如何使用
      • 序列化
    • 反序列化
  • 参考

简述

项目里需要使用LUA脚本将数据记录到文件,要方便的增加、查找、删除,要方便的加载与存回。
使用序列化/反序列化 + lua table可以很容易实现这些功能。
序列化将table转换为字符串
反序列化将table从字符串中恢复出来

在这里插入图片描述

如何集成?

进入https://github.com/pkulchenko/serpent,下载serpent.lua, 将这个文件复制到lua可见的地方,比如工程目录一级路径。我这里放到了LUA的同级路径,通过测试发现可以require到这个模块。
在这里插入图片描述

如何使用

序列化或者反序列化之前,要先加载serpent模块

serpent_handle = require "serpent"
assert(serpent_handle)

序列化

首先,我们构建一个即将序列化的table,table中包含按照下标顺序递增的数据,包含字典数据,包含子表,内容如下

local Send_Table = {1,2,3,["name"] = "winston",age = 16,child_table = {hair_length = 1000,hair_color = "Black"}
}

serpent提供三种序列化API,dump,line, block,三者没有太多的区别,dump是全功能的,line和block没有办法做表的自我引用。
向这些函数中输入一个表作为形参,函数将会返回序列化之后的字符串
我们把每一种都打印出来观察一下

--store_string = serpent_handle.dump(Send_Table)
--print(store_string)do local _={[1]=1,[2]=2,[3]=3,name="winston",age=16,child_table={hair_color="Black",hair_length=1000}};return _;end
--store_string = serpent_handle.line(Send_Table)
--print(store_string){1, 2, 3, age = 16, child_table = {hair_color = "Black", hair_length = 1000} --[[table: 000002a2d1245120]], name = "winston"} --[[table: 000002a2d12458a0]]
--store_string = serpent_handle.block(Send_Table)
--print(store_string){1,2,3,age = 16,child_table = {hair_color = "Black",hair_length = 1000} --[[table: 0000028afdd050e0]],name = "winston"
} --[[table: 0000028afdd05a20]]

可以看出,dump似乎是一个函数,返回定义的local表_
line像是把表的内存都定义到了,不知道有什么用,所有信息记录到一行。
block就是line插入回车的版本。

拿到这些字符串之后,我们就可以将其存入文件保存下来了,文件I/O不在本文讨论范围,参考https://www.runoob.com/lua/lua-file-io.html

好吧,为了下一节的流畅叙述,还是贴个代码

file_handle = io.open("store.txt", "w+")
io.output(file_handle)
io.write(store_string)
io.close()

#

反序列化

我们把store.txt里的内容修改一下,
在这里插入图片描述
我们希望把修改过的数据反序列化到另一个表Recv_Table里,并且打印各个成员
反序列化使用如下:反序列化只有一个形参string,有两个返回值ok和res。ok指示反序列化是否成功,res是反序列化后的表

ok, res = serpent.load(string)

测试代码如下:

serpent_handle = require "serpent"
assert(serpent_handle)file_handle = io.open("store.txt", "r")
io.input(file_handle)
local ok, Recv_Table = serpent_handle.load(io.read("a*"))
io.close()print("Recv_Table[1]:"..Recv_Table[1])
print("Recv_Table[2]:"..Recv_Table[2])
print("Recv_Table[3]:"..Recv_Table[3])
print("age:"..Recv_Table.age)
print("hair_color:"..Recv_Table.child_table.hair_color)
print("name:"..Recv_Table.name)

现象如下
在这里插入图片描述

参考

更多信息,参考https://github.com/pkulchenko/serpent

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

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

相关文章

2024双11海外购物新选择,逆向代购商家的营销利器

各大电商平台早已蓄势待发,迎接双11这场年度消费盛宴。与往年相比,今年的双11筹备工作启动得更早,国庆假期刚一结束,各大平台便进入了紧张的筹备阶段。对于遍布全球的海外购物者而言,无论是热衷于探索中国文化的外国人…

Cyber​​Panel upgrademysqlstatus 远程命令执行漏洞(QVD-2024-44346)

0x01 产品简介 CyberPanel是一个开源的Web控制面板,它提供了一个用户友好的界面,用于管理网站、电子邮件、数据库、FTP账户等。CyberPanel旨在简化网站管理任务,使非技术用户也能轻松管理自己的在线资源。 0x02 漏洞概述 该漏洞源于upgrademysqlstatus接口未做身份验证和…

【万户软件-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

大舍传媒:海外发稿传统新闻媒体发布新闻稿与门户媒体宣发的区别?

大舍传媒:海外发稿传统新闻媒体发布新闻稿与门户媒体宣发的区别? 在当今全球化的信息时代,新闻报道的传播渠道日益多元化,企业和个人在进行海外发稿时,往往面临着在传统新闻媒体和门户媒体之间的选择。那么&#xff0…

力扣hot100-->hash表/map

hash表/map 1. 1. 两数之和 简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 …

【在Linux世界中追寻伟大的One Piece】Socket编程TCP

目录 1 -> TCP socket API 2 -> V1 -Echo Server 2.1 -> 测试多个连接的情况 1 -> TCP socket API socket(): socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符。应用程序可以像读写文件一样用r…

基于MATLAB疲劳监测系统

MATLAB疲劳监测系统课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI,通过输入视频,分帧,定位眼睛和嘴巴,通过眼睛和嘴巴的张合度,来判别是否疲劳。 二、操作步骤 第一步:最好电…

NCCL安装(Ubuntu等)

目录 一、NCCL的定义二、安装NCCL的原因1、加速多GPU通信2、支持流行的深度学习框架3、提高计算效率4、易于使用和集成5、可扩展性 三、NCCL安装方法1、下载安装包2、更新APT数据库3、使用APT安装libnccl2包,另外,如果需要使用NCCL编译应用程序&#xff…

PostgreSQL的学习心得和知识总结(一百五十七)|新的 COPY 选项 LOG_VERBOSITY

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

Android 刘海屏适配指南

如果您不希望您的内容与刘海区域重叠, 以确保您的内容不会与状态栏及 导航栏。如果您要呈现在刘海区域中,请使用 WindowInsetsCompat.getDisplayCutout() 检索 DisplayCutout 对象 包含每个刘海屏的安全边衬区和边界框。借助这些 API 您需要检查视频内容…

Spring Boot 配置文件详解与最佳实践

目录 前言1. 配置文件的作用2. Spring Boot 主要配置内容2.1 Actuator 配置2.2 缓存配置2.3 核心配置2.4 数据库与数据迁移配置2.5 开发工具配置2.6 Docker Compose 配置2.7 JSON 配置2.8 安全配置 3. 多个配置文件的处理方法3.1 使用 Profile 文件区分环境3.2 结合优先级加载配…

【05-多处理器编程入门到放弃】课堂代码调试

lecture05是并发的第一节课。主要讲了入门(两个API,create和join)和放弃(原来很自然的串行想法) 并发线程模型最小线程库线程自问自答11思考题:3个T_sum线程,sum的结果最小是多少?补…

探索Python文档自动化的奥秘:揭开docxtpl库的神秘面纱

文章目录 探索Python文档自动化的奥秘:揭开docxtpl库的神秘面纱1. 背景介绍2. 库简介3. 安装指南4. 基础函数介绍5. 实际应用场景6. 常见问题及解决方案7. 总结 探索Python文档自动化的奥秘:揭开docxtpl库的神秘面纱 1. 背景介绍 在日常工作中&#xf…

计算机四级嵌入式·操作系统知识点总结(一)

页式存储管理方案:页号是地址的高位部分,页内地址是地址的低位部分。页式存储管理方案中的快表放在缓存Cache中。在页式存储管理方案中,用户使用连续的逻辑地址。在虚拟页式存储管理系统中,有效位决定是否产生缺页中断,有效位称为驻留位、存在位、中断位。 修改位表示该页…

Web大学生网页作业成品——家乡广州介绍设计与实现(HTML+CSS)(5个页面)

🎉🎉🎉 常见网页设计作业题材有**汽车、环保、明星、文化、国家、抗疫、景点、人物、体育、植物、公益、图书、节日、游戏、商城、旅游、家乡、学校、电影、动漫、非遗、动物、个人、企业、美食、婚纱、其他**等网页设计题目, 可满足大学生网…

【信息安全设计】系统安全设计方案,系统安全保护设施设计实施方案(Word原件)

1.1 总体设计 1.1.1 设计原则 1.2 物理层安全 1.2.1 机房建设安全 1.2.2 电气安全特性 1.2.3 设备安全 1.2.4 介质安全措施 1.3 网络层安全 1.3.1 网络结构安全 1.3.2 划分子网络 1.3.3 异常流量管理 1.3.4 网络安全审计 1.3.5 网络访问控制 1.3.6 完整性检查 1.…

【 纷享销客-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

Halcon-模板匹配(WPF)

halcon的代码 dev_open_window (0, 0, 512, 512, black, WindowHandle) read_image (Image, C:/Users/CF/Desktop/image.jpg) dev_display (Image)draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) r…