-3

テーブルをシリアライズして、データベースに挿入し、後で取得できるようにしたいと考えています。どうすればいいですか?

4

2 に答える 2

0

Luaの値をうまくシリアライズするには?

local serialize
do
    local num_fmt = '%.17g'
    local NaN_serialized = {  -- This idea was stolen from lua-nucleo
        [num_fmt:format(1/0)] = '1/0',
        [num_fmt:format(-1/0)] = '-1/0',
        [num_fmt:format(0/0)] = '0/0'
    }
    local function serialize_table(t, indent)
        indent = indent or ''
        local new_indent = indent..'\t'
        if next(t) == nil then
            return '{}'
        else
            local lines = {}
            local function add_line(key)
                local ser_key = key
                if type(key) ~= 'string' or not key:find'^[%a_][%w_]*$' then
                    ser_key = '['..serialize(key, new_indent)..']'
                end
                table.insert(lines, 
                    ser_key..' = '..serialize(t[key], new_indent))
            end
            local other_keys = {}
            local keys = setmetatable({number = {}, string = {}}, 
                {__index = function() return other_keys end})
            for k in pairs(t) do
                table.insert(keys[type(k)], k)
            end
            table.sort(keys.number)
            table.sort(keys.string)
            for _, k in ipairs(keys.number) do
                add_line(k)
            end
            for _, k in ipairs(keys.string) do
                add_line(k)
            end
            for _, k in ipairs(other_keys) do
                add_line(k)
            end
            return '{\n'..new_indent..table.concat(lines, ',\n'..new_indent)
                ..'\n'..indent..'}'
        end
    end

    function serialize(v, indent)
        if type(v) == 'string' then
            return ('%q'):format(v)
        elseif type(v) == 'boolean' then
            return tostring(v)
        elseif type(v) == 'nil' then
            return tostring(v)
        elseif type(v) == 'number' then
            return (num_fmt:format(v):gsub('^.*', NaN_serialized))
        elseif type(v) == 'table' then
            return serialize_table(v, indent)
        else
            error('Can not serialize '..type(v))
        end
    end
end

-- What it can:
print(serialize(math.huge))
print(serialize'"What\'s up?"\n\t123')
print(serialize{{}, {{}}})

-- And what it can not:
local t = {}
local tt = {[t] = t}
print(serialize(tt)) -- tt is not a tree, so it was serialized incorrectly
于 2013-06-25T18:21:15.080 に答える