Skip to content

Instantly share code, notes, and snippets.

@rangercyh
Last active March 3, 2017 08:22
Show Gist options
  • Save rangercyh/6492791 to your computer and use it in GitHub Desktop.
Save rangercyh/6492791 to your computer and use it in GitHub Desktop.
序列化和反序列化lua表
--分割字符串
function sf_Split(str, splitor, nMatchModel)
splitor = splitor or ','
nMatchModel = nMatchModel or true
local strArray = {}
local nStart = 1
local splitorLen = string.len(splitor)
local index = string.find(str, splitor, nStart, nMatchModel)
while index do
strArray[#strArray + 1] = string.sub(str, nStart, index - 1)
nStart = index + splitorLen
index = string.find(str, splitor, nStart, nMatchModel)
end
strArray[#strArray + 1] = string.sub(str, nStart, string.len(str))
return #strArray, strArray
end
--把table里面的可转换为数字的转换为数字
function gf_TableNumberElementToNumber(tb)
for k,v in pairs(tb) do
if type(v) == "string" and tonumber(v) ~= nil then
tb[k] = tonumber(v)
elseif type(v) == "table" then
tb[k] = gf_TableNumberElementToNumber(v)
end
end
return tb
end
--序列化和反序列化
function PackSerializedData(SeriData)
if type(SeriData) == "string" then
if SeriData == "" then
return {}
else
local _, tbContent = sf_Split(SeriData, ";")
for k, v in pairs(tbContent) do
_, tbContent[k] = sf_Split(v, ",")
end
return gf_TableNumberElementToNumber(tbContent)
end
elseif type(SeriData) == "table" then
local szContent = ""
for k, v in ipairs(SeriData) do
for p, q in ipairs(v) do
if (type(q) == "number") or (type(q) == "string") then
szContent = szContent..q
end
if p < #v then
szContent = szContent..","
end
end
if k < #SeriData then
szContent = szContent..";"
end
end
return szContent
end
end
local test_tb = {
[1] = {
[1] = 1,
[2] = 2,
},
[2] = {
[1] = 3,
[2] = 4,
},
[3] = {
[1] = 5,
[2] = "asdf",
},
}
local test_str = "1,2;3,4;5,asdf"
print(PackSerializedData(PackSerializedData(test_str)) == test_str)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment