加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua里实现将table转成字符串(序列化)和将字符串转换回table(反

发布时间:2020-12-14 22:02:22 所属栏目:大数据 来源:网络整理
导读:--[[?? ?file?name?:????table序列化和反序列化的问题.lua?? ?author??:??????Clark/陈泽丹?? ?created?:??????2011-12-22?? ?备注:?? ?支持table的递归结构,但数据类型不支持function属性(因为function只是记录地址,在不同机器上序列化和反序列化后的地

  1. --[[??
  2. ?file?name?:????table序列化和反序列化的问题.lua??
  3. ?author??:??????Clark/陈泽丹??
  4. ?created?:??????2011-12-22??
  5. ?备注:??
  6. ?支持table的递归结构,但数据类型不支持function属性(因为function只是记录地址,在不同机器上序列化和反序列化后的地址相同没什么意义)??
  7. ???
  8. ?后记:????
  9. ?郁闷,?写完到网上一搜,?才发现原来Lua有提供一些现成的函数可用来做序列化和反序列化操作。。。????
  10. ?其中loadstring可以执行字符串。????
  11. ?通过????
  12. ?lua?=?"return?"?..?lua????
  13. ?local?func?=?loadstring(lua)????
  14. ?即实现了反序列化。。。??
  15. --]]??
  16. ??
  17. ??
  18. -----------?个人编写?-----------------??
  19. --table转字符串(只取标准写法,以防止因系统的遍历次序导致ID乱序)??
  20. function?sz_T2S(_t)??
  21. ????local?szRet?=?"{"??
  22. ????function?doT2S(_i,?_v)??
  23. ????????if?"number"?==?type(_i)?then??
  24. ????????????szRet?=?szRet?..?"["?..?_i?..?"]?=?"??
  25. ????????????if?"number"?==?type(_v)?then??
  26. ????????????????szRet?=?szRet?..?_v?..?","??
  27. ????????????elseif?"string"?==?type(_v)?then??
  28. ????????????????szRet?=?szRet?..?'"'?..?_v?..?'"'?..?",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????????????elseif?"table"?==?type(_v)?then??
  29. ????????????????szRet?=?szRet?..?sz_T2S(_v)?..?",153); font-weight:bold; background-color:inherit">else??
  30. ????????????????szRet?=?szRet?..?"nil,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????????????end??
  31. ????????elseif?"string"?==?type(_i)?then??
  32. ????????????szRet?=?szRet?..?'["'?..?_i?..?'"]?=?'??
  33. ????????????if?"number"?==?type(_v)?then??
  34. ????????????????szRet?=?szRet?..?_v?..?","??
  35. ????????????elseif?"string"?==?type(_v)?then??
  36. ????????????????szRet?=?szRet?..?'"'?..?_v?..?'"'?..?",248)"> ????????????elseif?"table"?==?type(_v)?then??
  37. ????????????????szRet?=?szRet?..?sz_T2S(_v)?..?",153); font-weight:bold; background-color:inherit">else??
  38. ????????????????szRet?=?szRet?..?"nil,248)"> ????????????end??
  39. ????????end??
  40. ????end??
  41. ????table.foreach(_t,?doT2S)??
  42. ????szRet?=?szRet?..?"}"??
  43. ????return?szRet??
  44. end??
  45. --字符串转table(反序列化,异常数据直接返回nil)??
  46. function?t_S2T(_szText)??
  47. ????--栈??
  48. ????function?stack_newStack()??
  49. ????????local?first?=?1??
  50. ????????local?last?=?0??
  51. ????????local?stack?=?{}??
  52. ????????local?m_public?=?{}??
  53. ????????function?m_public.pushBack(_tempObj)??
  54. ????????????last?=?last?+?1??
  55. ????????????stack[last]?=?_tempObj??
  56. ????????function?m_public.temp_getBack()??
  57. if?m_public.bool_isEmpty()?then??
  58. ????????????????return?nil??
  59. ????????????????local?val?=?stack[last]??
  60. ????????????????return?val??
  61. ????????function?m_public.popBack()??
  62. ????????????stack[last]?=?nil??
  63. ????????????last?=?last?-?1??
  64. ????????function?m_public.bool_isEmpty()??
  65. if?first?>?last?then??
  66. ????????????????first?=?1??
  67. ????????????????last?=?0??
  68. return?true??
  69. false??
  70. ????????end??
  71. ????????function?m_public.clear()??
  72. while?false?==?m_public.bool_isEmpty()?do??
  73. ????????????????stack.popFront()??
  74. ????????return?m_public??
  75. ????end??
  76. ????function?getVal(_szVal)??
  77. ????????local?s,?e?=?string.find(_szVal,'"',1,string.len(_szVal))??
  78. if?nil?~=?s?and?nil?~=?e?then??
  79. ????????????--return?_szVal??
  80. return?string.sub(_szVal,2,string.len(_szVal)-1)??
  81. return?tonumber(_szVal)??
  82. ????local?m_szText?=?_szText??
  83. ????local?charTemp?=?string.sub(m_szText,1)??
  84. ????if?"{"?==?charTemp?then??
  85. ????????m_szText?=?string.sub(m_szText,string.len(m_szText))??
  86. ????function?doS2T()??
  87. ????????local?tRet?=?{}??
  88. ????????local?tTemp?=?nil??
  89. ????????local?stackOperator?=?stack_newStack()??
  90. ????????local?stackItem?=?stack_newStack()??
  91. ????????local?val?=?""??
  92. true?do??
  93. ????????????local?dLen?=?string.len(m_szText)??
  94. if?dLen?<=?0?then??
  95. break??
  96. ????????????charTemp?=?string.sub(m_szText,153); font-weight:bold; background-color:inherit">if?"["?==?charTemp?or?"="?==?charTemp?then??
  97. ????????????????stackOperator.pushBack(charTemp)??
  98. ????????????????m_szText?=?string.sub(m_szText,dLen)??
  99. ????????????elseif?'"'?==?charTemp?then??
  100. ????????????????local?s,?e?=?string.find(m_szText,?'"',?2,?dLen)??
  101. if?nil?~=?s?and?nil?~=?e?then??
  102. ????????????????????val?=?val?..?string.sub(m_szText,s)??
  103. ????????????????????m_szText?=?string.sub(m_szText,s+1,dLen)??
  104. ????????????????????return?nil??
  105. ????????????????end??
  106. ????????????elseif?"]"?==?charTemp?then??
  107. if?"["?==?stackOperator.temp_getBack()?then??
  108. ????????????????????stackOperator.popBack()??
  109. ????????????????????stackItem.pushBack(val)??
  110. ????????????????????val?=?""??
  111. ????????????????????m_szText?=?string.sub(m_szText,248)"> ???????????????????? ????????????????end??
  112. ????????????elseif?","?==?charTemp?then??
  113. if?"="?==?stackOperator.temp_getBack()?then??
  114. ????????????????????stackOperator.popBack()??
  115. ????????????????????local?Item?=?stackItem.temp_getBack()??
  116. ????????????????????Item?=?getVal(Item)??
  117. ????????????????????stackItem.popBack()??
  118. if?nil?~=?tTemp?then??
  119. ????????????????????????tRet[Item]?=?tTemp??
  120. ????????????????????????tTemp?=?nil??
  121. ????????????????????????tRet[Item]?=?getVal(val)??
  122. ????????????????????end??
  123. ????????????????????val?=?""??
  124. ????????????elseif?"{"?==?charTemp?then??
  125. ????????????????local?t?=?doS2T()??
  126. if?nil?~=?t?then??
  127. ????????????????????szText?=?sz_T2S(t)??
  128. ????????????????????tTemp?=?t??
  129. ????????????????????--val?=?val?..?szText??
  130. ????????????elseif?"}"?==?charTemp?then??
  131. return?tRet??
  132. ????????????elseif?"?"?~=?charTemp?then??
  133. ????????????????val?=?val?..?charTemp??
  134. ????local?t?=?doS2T()??
  135. return?t??
  136. end??
  137. --[[??
  138. t?=?{1,3,"sdf",?a?=?"df",?qe?=?3,?{7},?qq?=?{{2,a={}}},?}??
  139. t.f?=?{1,3}??
  140. t.m?=?{3,4,5}??
  141. szT?=?sz_T2S(t)??
  142. print(szT)??
  143. print("-----------")??
  144. tq?=?t_S2T(szT)??
  145. szT?=?sz_T2S(tq)??
  146. --------?网上资料?-------------------??
  147. function?serialize(obj)??
  148. ????local?lua?=?""??
  149. ????local?t?=?type(obj)??
  150. if?t?==?"number"?then??
  151. ????????lua?=?lua?..?obj??
  152. ????elseif?t?==?"boolean"?then??
  153. ????????lua?=?lua?..?tostring(obj)??
  154. ????elseif?t?==?"string"?then??
  155. ????????lua?=?lua?..?string.format("%q",?obj)??
  156. ????elseif?t?==?"table"?then??
  157. ????????lua?=?lua?..?"{n"??
  158. for?k,?v?in?pairs(obj)? ????????lua?=?lua?..?"["?..?serialize(k)?..?"]="?..?serialize(v)?..?",n"??
  159. ????local?metatable?=?getmetatable(obj)??
  160. if?metatable?~=?nil?and?type(metatable.__index)?==?"table"?then??
  161. ????????????lua?=?lua?..?"["?..?serialize(k)?..?"]="?..?serialize(v)?..?",n"??
  162. ????????lua?=?lua?..?"}"??
  163. ????elseif?t?==?"nil"?then??
  164. ????????error("can?not?serialize?a?"?..?t?..?"?type.")??
  165. return?lua??
  166. function?unserialize(lua)??
  167. ????local?t?=?type(lua)??
  168. if?t?==?"nil"?or?lua?==?""?then??
  169. ????elseif?t?==?"number"?or?t?==?"string"?or?t?==?"boolean"?then??
  170. ????????lua?=?tostring(lua)??
  171. ????????error("can?not?unserialize?a?"?..?t?..?"?type.")??
  172. ????lua?=?"return?"?..?lua??
  173. ????local?func?=?loadstring(lua)??
  174. if?func?==?nil?then??
  175. return?func()??
  176. data?=?{["a"]?=?"a",?["b"]?=?"b",?[1]?=?1,?[2]?=?2,?["t"]?=?{1,?3}}??
  177. local?sz?=?serialize(data)??
  178. print(sz)??
  179. print("---------")??
  180. print(serialize(unserialize(sz))) ?

http://www.voidcn.com/article/p-hhamkjgx-bcy.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读