Replies: 2 comments 15 replies
-
ant.serialize这个包的名字可能有一定的误导性,但相关的回答,上一个讨论已经说得很清晰了。不过我还可以再重复一次。 datalist是被设计为便于阅读和手写的一个数据格式。任何时候都不要试图将某一个lua的table转为datalist格式(或者称之为序列化?)。这跟json、ini、xml之类的格式是一样的,显然不会有人觉得某一个lua的table不能转为一个json是json的问题。 |
Beta Was this translation helpful? Give feedback.
10 replies
-
我最终改了一个我期望的版本,支持将: local tb = {
node = {
conditions = {"and", {"or", {"hp", ">=", 2}, {"hp", "<=", 100}}, {"or", {"mp", ">=", 4}, {"mp", "<=", 10}}},
effect = {{"mp", "+=", 2}, {"hp", "-=", 2}}
}
} 保存为文本:
datalist自身可以正确将保存后的文本还原为原始table,所以这样做没问题~ 其他人如果有兴趣的话,可以参考下我对stringify.lua的改动(复制了一份到我的项目中):
示例代码如下: -- 这是新增函数,用于递归将table中的元素转为为string
local function parse_simple_table(v, depth)
if type(v) == "table" then
local s = {}
for i, v in ipairs(v) do
s[i] = parse_simple_table(v, depth + 1)
end
if depth == 0 then
return table.concat(s, ", ")
else
return "{" .. table.concat(s, ", ") .. "}"
end
else
return stringify_basetype(v)
end
end
-- 修改原有函数
local function stringify_array(n, prefix, t)
-- 此处是新增逻辑
if is_simple_array_recursively(t) then
out[#out+1] = indent(n)..prefix
out[#out+1] = indent(n + 1) .. parse_simple_table(t, 0)
else
-- 这里是原始逻辑
end
end
-- 修改原有函数
function stringify_(n, data)
if isArray(data) then
-- 此处是新增逻辑
if is_simple_array_recursively(data) then
out[#out+1] = indent(n) .. parse_simple_table(data, 0)
else
-- 这里是原始逻辑
end
else
-- 这里是原始逻辑
end
end 我目前只是大概测试了下没啥问题,后续会持续使用关注下~ |
Beta Was this translation helpful? Give feedback.
5 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
之前我发表过一些疑问 关于stringify的疑问
现在我又遇到一个问题,下面这个tb无法被序列化
我试了下也看了下源码,对于顺序数组的情况,程序会严格递归判断第一个元素的类型,如果是table,那后面也得是table,如果第一个不是table,那后面也不能有table,否则就会报错或者数据被忽略。
所以,下面这个tb也是无法被序列化的,虽然第一层元素都是table,但第二层数据类型不一致
我想表达的是:
上面这个规则确实有利于: “将数据转换为其它标记语言表示” 。
但是,从使用者的情况来看,不是每一个人都有这个需求呀,为什么要遵守这个规则呢?
是否可以这样考虑:在序列化时尽量兼容lua的特性,如果使用者有转换为其他语言的需求,自己在序列化时注意下格式呢?
Beta Was this translation helpful? Give feedback.
All reactions