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)四、实用小工具在数据序列化过程中,一些实用的小工具函数可以提高开发效率。以下是两个常用的小工具函数示例: 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")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 的常用函数及其使用方法。这些函数提供了强大的数据序列化和反序列化能力,帮助开发者高效地进行数据持久化和传输。 |