diff --git a/Serializer.lua b/Serializer.lua index d22be17..bd7ae1d 100644 --- a/Serializer.lua +++ b/Serializer.lua @@ -1,34 +1,54 @@ -- Tabelle in einen String umwandeln, rekursiv -- Funktionen als Lua-Werte werden ignoriert -function __tostring(tab) - local t=type(tab) +-- forbidden ist ein set von elterntabellen zum erkennen von kreisreferenzen +function serialize(value, forbidden) + forbidden = forbidden or {} + local t=type(value) if t=="table" then + -- Kreisreferenz -> als nil serialisieren + if forbidden[value] then return "nil" end + forbidden[value]=true + local r="" - -- Tabellen-Keys sammeln und sortieren + local numeric_indexes={} + + -- Schnellversion fuer numerische Tabellen + for k,v in ipairs(value) do + numeric_indexes[k]=true + r=r..(r=="" and "" or ",")..serialize(v, forbidden) + end + + -- Tabellen-Keys fuer assoziative Tabellen sammeln local tkeys={} - for k in pairs(tab) do table.insert(tkeys, k) end - table.sort(tkeys, function(a,b) return tostring(a)