girvel/ldump: Serialize any lua data


API | Overloading serialization | Development

ldump is a flexible serializer, able to serialize any data, starting with circular references, tables as keys, functions with upvalues, metatables and ending with coroutines, threads and userdata (by defining how they should be serialized). It outputs valid Lua code that recreates the original object, doing the deserialization through load(data)(). It aims for functionality and flexibility instead of speed and size, allowing full serialization of complex data, such as video game saves. The output is large, but can be drastically reduced with modern compression algorithms.

Inspired by Ser. Supports Lua 5.1, 5.2, 5.3, 5.4 and LuaJIT. Tested for edge cases, such as joined upvalues and _ENV redefinition. Fully annotated in compatibility with LuaLS.

Type Support
nil, boolean, number, string full
function full
userdata user-defined
thread user-defined
table full
metatables* full

local ldump = require("ldump")

local upvalue = 42
local world = 
  name = "New world",
  get_answer = function() return upvalue end,


local serialized_data = ldump(world)  -- serialize to a string
local loaded_world = load(serialized_data)()  -- deserialize the string

See as a test at /tests/test_use_case.lua:7

local ldump = require("ldump")

-- basic tables
local game_state = 
  player = name = "Player",
  boss = name = "Boss",


-- circular references & tables as keys
game_state.deleted_entities = 
  [game_state.boss] = true,


-- functions even with upvalues
local upvalue = 42
game_state.get_answer = function() return upvalue end

-- fundamentally non-serializable types if overriden
local create_coroutine = function()
  return coroutine.wrap(function()
    coroutine.yield(1337)
    coroutine.yield(420)
  end)
end

-- override serialization
game_state.coroutine = create_coroutine()
ldump.serializer.handlers[game_state.coroutine] = create_coroutine

local serialized_data = ldump(game_state)  -- serialize
local loaded_game_state = load(serialized_data)()  -- deserialize

See as a test at /tests/test_use_case.lua:23

Copy the raw contents of init.lua from the latest release into your lib/ldump.lua or git clone -b v1.2.0 https://github.com/girvel/ldump inside the lib/ — you still would be able to do require("ldump").



Source link