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
Uh oh!
There was an error while loading. Please reload this page.
-
之前我发表过一些疑问 关于stringify的疑问
现在我又遇到一个问题,下面这个tb无法被序列化
我试了下也看了下源码,对于顺序数组的情况,程序会严格递归判断第一个元素的类型,如果是table,那后面也得是table,如果第一个不是table,那后面也不能有table,否则就会报错或者数据被忽略。
所以,下面这个tb也是无法被序列化的,虽然第一层元素都是table,但第二层数据类型不一致
我想表达的是:
上面这个规则确实有利于: “将数据转换为其它标记语言表示” 。
但是,从使用者的情况来看,不是每一个人都有这个需求呀,为什么要遵守这个规则呢?
是否可以这样考虑:在序列化时尽量兼容lua的特性,如果使用者有转换为其他语言的需求,自己在序列化时注意下格式呢?
Beta Was this translation helpful? Give feedback.
All reactions