找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

2

听众

108

主题
发表于 2024-6-20 23:46:00 | 查看: 196| 回复: 0
Lua 常用库系列:第十六篇【序列化库】
在数据持久化、网络传输等场景中,序列化和反序列化是常见需求。Lua 提供了多种库用于数据的序列化和反序列化,常见的包括 serpent、json 和 pl.pretty 等。本文将详细介绍 Lua 的序列化库及其常用函数和使用方法。
序列化库概述
Lua 中的序列化库提供了将 Lua 数据结构(如表、字符串、数字等)转换为可存储或传输的字符串格式的功能,以及从字符串格式还原为 Lua 数据结构的功能。本文将主要介绍 serpent、json 和 pl.pretty 这三个常用的序列化库。
一、Serpent 库的使用
serpent 是一个强大的序列化库,支持将 Lua 数据结构序列化为字符串,并能够从字符串反序列化为 Lua 数据结构。
安装 Serpent
可以使用 LuaRocks 安装 serpent:
luarocks install serpent
基本使用
local serpent = require("serpent")

-- 序列化
local tbl = {name = "Lua", version = "5.3"}
local serialized = serpent.dump(tbl)
print("序列化结果:", serialized)

-- 反序列化
local loadstring = loadstring or load
local deserialized = loadstring(serialized)()
print("反序列化结果:", deserialized.name, deserialized.version)二、JSON 库的使用
JSON(JavaScript Object Notation)是一种常用的数据交换格式。Lua 有多个 JSON 库可以选择,常见的有 cjson 和 dkjson。
安装 Lua CJSON
可以使用 LuaRocks 安装 cjson:
luarocks install lua-cjson
基本使用
local cjson = require("cjson")

-- 序列化
local tbl = {name = "Lua", version = "5.3"}
local serialized = cjson.encode(tbl)
print("JSON 序列化结果:", serialized)

-- 反序列化
local deserialized = cjson.decode(serialized)
print("JSON 反序列化结果:", deserialized.name, deserialized.version)三、Penlight 库的使用
pl.pretty 是 Penlight 工具库中的一个模块,提供了将 Lua 表格式化为易读字符串的功能。
安装 Penlight
可以使用 LuaRocks 安装 Penlight:
luarocks install penlight
基本使用
local pretty = require("pl.pretty")

-- 序列化
local tbl = {name = "Lua", version = "5.3"}
local serialized = pretty.write(tbl)
print("Pretty 序列化结果:", serialized)

-- 反序列化
local deserialized = pretty.read(serialized)
print("Pretty 反序列化结果:", deserialized.name, deserialized.version)四、实用小工具
在数据序列化过程中,一些实用的小工具函数可以提高开发效率。以下是两个常用的小工具函数示例:
  • 将 Lua 表保存为文件

local serpent = require("serpent")

function saveTableToFile(tbl, filename)
    local serialized = serpent.dump(tbl)
    local file = io.open(filename, "w")
    if file then
        file:write(serialized)
        file:close()
        print("表已保存到文件:", filename)
    else
        print("无法打开文件:", filename)
    end
end

local tbl = {name = "Lua", version = "5.3"}
saveTableToFile(tbl, "table.txt")
  • 从文件加载 Lua 表

local serpent = require("serpent")

function loadTableFromFile(filename)
    local file = io.open(filename, "r")
    if file then
        local serialized = file:read("*a")
        file:close()
        local loadstring = loadstring or load
        return loadstring(serialized)()
    else
        print("无法打开文件:", filename)
        return nil
    end
end

local tbl = loadTableFromFile("table.txt")
if tbl then
    print("从文件加载的表:", tbl.name, tbl.version)
end五、综合示例
通过组合使用 serpent、cjson 和 pl.pretty 库,可以实现一个数据序列化和反序列化的工具。以下示例演示如何序列化和反序列化不同格式的数据:
data_serializer.lua
local serpent = require("serpent")
local cjson = require("cjson")
local pretty = require("pl.pretty")

local data = {name = "Lua", version = "5.3", features = {"simple", "efficient", "extensible"}}

-- 序列化为 Serpent 格式
local serpent_serialized = serpent.dump(data)
print("Serpent 序列化结果:\n", serpent_serialized)

-- 反序列化为 Lua 表
local serpent_deserialized = loadstring(serpent_serialized)()
print("Serpent 反序列化结果:", serpent_deserialized.name, serpent_deserialized.version)

-- 序列化为 JSON 格式
local json_serialized = cjson.encode(data)
print("JSON 序列化结果:\n", json_serialized)

-- 反序列化为 Lua 表
local json_deserialized = cjson.decode(json_serialized)
print("JSON 反序列化结果:", json_deserialized.name, json_deserialized.version)

-- 序列化为 Pretty 格式
local pretty_serialized = pretty.write(data)
print("Pretty 序列化结果:\n", pretty_serialized)

-- 反序列化为 Lua 表
local pretty_deserialized = pretty.read(pretty_serialized)
print("Pretty 反序列化结果:", pretty_deserialized.name, pretty_deserialized.version)
将以上代码保存为 data_serializer.lua,然后使用 Lua 运行:
lua data_serializer.lua总结
本文介绍了 Lua 序列化库中的 serpent、cjson 和 pl.pretty 的常用函数及其使用方法。这些函数提供了强大的数据序列化和反序列化能力,帮助开发者高效地进行数据持久化和传输。
下一篇文章将介绍 Lua 的加密库,敬请期待。


Lua 常用库系列:第十七篇【加密库】
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-3-13 04:22 , Processed in 0.566074 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表