2d lua テーブルを文字列に変換したいのですが、文字列に変換した後、新しく作成した文字列を使用してテーブルに戻します。このプロセスはシリアライゼーションと呼ばれ、以下の URL で説明されているようですが、コードを理解するのに苦労しており、ここの誰かが単純な table.toString および table.fromString 関数を持っていることを望んでいました
http://lua- users.org/wiki/TableSerialization
8 に答える
テーブルをシリアル化するために、次のコードを使用しています。
function serializeTable(val, name, skipnewlines, depth)
skipnewlines = skipnewlines or false
depth = depth or 0
local tmp = string.rep(" ", depth)
if name then tmp = tmp .. name .. " = " end
if type(val) == "table" then
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
for k, v in pairs(val) do
tmp = tmp .. serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
end
tmp = tmp .. string.rep(" ", depth) .. "}"
elseif type(val) == "number" then
tmp = tmp .. tostring(val)
elseif type(val) == "string" then
tmp = tmp .. string.format("%q", val)
elseif type(val) == "boolean" then
tmp = tmp .. (val and "true" or "false")
else
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
end
return tmp
end
作成されたコードは、loadstring() を使用して実行できます: http://www.lua.org/manual/5.1/manual.html#pdf-loadstring 'name' パラメーターに引数を渡した場合 (または後で追加した場合) :
s = serializeTable({a = "foo", b = {c = 123, d = "foo"}})
print(s)
a = loadstring(s)()
lhf が投稿したコードは、リンクしたページのどのコードよりもはるかに単純なコード例であるため、理解を深めていただければ幸いです。出力を印刷する代わりに文字列を出力するように適応させると、次のようになります。
t = {
{11,12,13},
{21,22,23},
}
local s = {"return {"}
for i=1,#t do
s[#s+1] = "{"
for j=1,#t[i] do
s[#s+1] = t[i][j]
s[#s+1] = ","
end
s[#s+1] = "},"
end
s[#s+1] = "}"
s = table.concat(s)
print(s)
シリアライゼーションの一般的な考え方は、テーブルなどのデータ構造からすべてのデータ ビットを取得し、そのデータ構造をループしながら、これらすべてのデータ ビットと書式設定文字を含む文字列を作成することです。
JSONモジュールはどうですか?そうすれば、より良い交換可能なデータも得られます。私は通常、cmjjson がサポートしない utf-8 もサポートする dkjson を好みます。
仮定して:
- ループがありません(テーブルbを参照するテーブルとaを参照するb)
- テーブルは純粋な配列です(すべてのキーは1から始まる連続した正の整数です)
- 値は整数のみです(文字列などはありません)
次に、再帰的なソリューションを簡単に実装できます。
function serialize(t)
local serializedValues = {}
local value, serializedValue
for i=1,#t do
value = t[i]
serializedValue = type(value)=='table' and serialize(value) or value
table.insert(serializedValues, serializedValue)
end
return string.format("{ %s }", table.concat(serializedValues, ', ') )
end
この関数の結果の文字列return
の前に。を付けて、.luaファイルに保存します。
-- myfile.lua
return { { 1, 2, 3 }, { 4, 5, 6 } }
dofileを使用してテーブルを元に戻すことができます。
t = dofile 'myfile.lua'
ノート:
- ループがある場合は、それらを明示的に処理する必要があります。通常は、繰り返しを「追跡」するための追加のテーブルを使用します。
- 純粋な配列がない場合は、tを別の方法で解析し、キーのレンダリング方法を処理する必要があります(文字列ですか、他のテーブルですか?など)。
- 整数とサブテーブル以外のものがある場合、計算
serializedValue
はより複雑になります。
よろしく!
これは、テーブルに数字のみが含まれていると想定する簡単なプログラムです。でロードできる Lua コードを出力しloadstring()()
ます。印刷するのではなく、文字列に出力するように調整します。ヒント: print を再定義して出力をテーブルに収集し、最後に出力テーブルを を使用して文字列に変換しますtable.concat
。
t = {
{11,12,13},
{21,22,23},
}
print"return {"
for i=1,#t do
print"{"
for j=1,#t[i] do
print(t[i][j],",")
end
print"},"
end
print"}"