28. Lua table的串行化

  1. 無環(huán)的 table 的保存
-- 將對象序列化
function serialize( o )
  if type(o) == "number" then  -- 是否是數(shù)字
      io.write(o)
  elseif type(o) == "string" then  -- 是否是 字符串
      io.write(string.format( "%q", o ))  -- %q 接受一個字符串并將其轉化為可安全被Lua編譯器讀入的格式
  elseif type(o) == "table" then  -- 是否是 table
      io.write("{\n")
      for k,v in pairs(o) do
          -- io.write(" " ,  k , "=")
          io.write("[" ,  k , "]=")
          serialize( v )
          io.write(",\n")
      end
      io.write("}\n")
  else
      error("cannot serialize a " .. type(o))
  end
end

a = {a=12 , b = 'lua' , key = 'another "one"'}

serialize(a)

serialize{a=12 , ["if"] = 'lua' , key = 'another "one"'}
  1. 有環(huán) table 的保存
-- 保存有環(huán)的table

function basicserialize(o)
  if type(o) == "number" then
      return tostring(o)
  else -- 假定是一個字符串
      return string.format("%q", o )
  end
end

function save( name , value , saved )
  saved = saved or {  }  -- 初始值
  io.write( name , "=" )
  if type(value) == "number" or type( value ) == "string" then
      io.write( basicserialize(value) , "\n" )
  elseif type(value) == "table" then
      if saved[value] then -- 該value是否已保存過
          io.write(saved[value],"\n")  -- 使用先前的名字
      else
          saved[value] = name  -- 為下次使用保持名字
          io.write("{}\n")
          for k , v in pairs(value) do
              k = basicserialize( k )
              local fname =string.format( "%s[%s]" , name , k )
              save( fname , v , saved )
          end
      end
  else
      error("cannot save a " .. type(value) )
  end
end

--[[
a = { x = 1 , y = 2 , key = 128 }
save( "s" , a )
--]]

--[[
a = { x = 1 , y = 2 , { 3 ,4 ,5} }
a[2] = a   -- 環(huán)
a.z = a[1]  -- 共享子table
save( "s" , a )
--]]

a = {{ "one" , "two" } , 3 }
b = { k = a[1] }
local t = {}
save("a" , a , t )
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末量窘,一起剝皮案震驚了整個濱河市凤壁,隨后出現(xiàn)的幾起案子烟很,更是在濱河造成了極大的恐慌,老刑警劉巖糖赔,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異济炎,居然都是意外死亡,警方通過查閱死者的電腦和手機沸伏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來动分,“玉大人毅糟,你說我怎么就攤上這事±焦” “怎么了姆另?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坟乾。 經(jīng)常有香客問我迹辐,道長,這世上最難降的妖魔是什么甚侣? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任明吩,我火速辦了婚禮,結果婚禮上殷费,老公的妹妹穿的比我還像新娘印荔。我一直安慰自己,他們只是感情好详羡,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布仍律。 她就那樣靜靜地躺著,像睡著了一般实柠。 火紅的嫁衣襯著肌膚如雪水泉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天主到,我揣著相機與錄音茶行,去河邊找鬼。 笑死登钥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的娶靡。 我是一名探鬼主播牧牢,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姿锭!你這毒婦竟也來了塔鳍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤呻此,失蹤者是張志新(化名)和其女友劉穎轮纫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焚鲜,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掌唾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年放前,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糯彬。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡凭语,死狀恐怖,靈堂內的尸體忽然破棺而出撩扒,到底是詐尸還是另有隱情似扔,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布搓谆,位于F島的核電站炒辉,受9級特大地震影響,放射性物質發(fā)生泄漏泉手。R本人自食惡果不足惜黔寇,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望螃诅。 院中可真熱鬧啡氢,春花似錦、人聲如沸术裸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袭艺。三九已至搀崭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猾编,已是汗流浹背瘤睹。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留答倡,地道東北人轰传。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像瘪撇,于是被迫代替她去往敵國和親获茬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容