6

2d lua テーブルを文字列に変換したいのですが、文字列に変換した後、新しく作成した文字列を使用してテーブルに戻します。このプロセスはシリアライゼーションと呼ばれ、以下の URL で説明されているようですが、コードを理解するのに苦労しており、ここの誰かが単純な table.toString および table.fromString 関数を持っていることを望んでいました
http://lua- users.org/wiki/TableSerialization

4

8 に答える 8

17

テーブルをシリアル化するために、次のコードを使用しています。

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)()
于 2011-05-21T12:14:07.507 に答える
9

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)

シリアライゼーションの一般的な考え方は、テーブルなどのデータ構造からすべてのデータ ビットを取得し、そのデータ構造をループしながら、これらすべてのデータ ビットと書式設定文字を含む文字列を作成することです。

于 2011-05-20T17:57:58.303 に答える
7

JSONモジュールはどうですか?そうすれば、より良い交換可能なデータも得られます。私は通常、cmjjson がサポートしない utf-8 もサポートする dkjson を好みます。

于 2011-05-21T00:30:25.250 に答える
2

仮定して:

  • ループがありません(テーブル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はより複雑になります。

よろしく!

于 2011-05-21T08:06:25.470 に答える
2

これは、テーブルに数字のみが含まれていると想定する簡単なプログラムです。でロードできる 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"}"
于 2011-05-20T17:47:56.373 に答える