LUA教程序列化-48

   日期:2020-07-17     浏览:95    评论:0    
核心提示:我们经常需要序列化一些数据,为了将数据转换为字节流或者字符流,这样我们就可以保存到文件或者通过网络发送出去。我们可以在Lua代码中描述序列化的数据,在这种方式下,我们运行读取程序即可从代码中构造出保存的值。通常,我们使用这样的方式varname =来保存一个全局变量的值。varname部分比较容易理解,下面我们来看看如何写一个产生值的代码。对于一个数值来说:function serialize (o) if type(o) == number then io.writ..

我们经常需要序列化一些数据 ,为了将数据转换为字节流或者字符流,这样我们就可以保存到文件或者通过网络发送出去。我们可以在Lua代码中描述序列化的数据,在这种方式下,我们运行读取程序即可从代码中构造出保存的值。

通常,我们使用这样的方式varname = 来保存一个全局变量的值。varname部分比较容易理解,下面我们来看看如何写一个产生值的代码。对于一个数值来说:

function serialize (o)
    if type(o) == "number" then
       io.write(o)
    else ...
end

对于字符串值而言,原始的写法应该是:

if type(o) == "string" then
    io.write("'", o, "'")

然而,如果字符串包含特殊字符(比如引号或者换行符),产生的代码将不是有效的Lua程序。这时候你可能用下面方法解决特殊字符的问题:

if type(o) == "string" then
 
    io.write("[[", o, "]]")

千万不要这样做!双引号是针对手写的字符串的而不是针对自动产生的字符串。如果有人恶意的引导你的程序去使用" ]]..os.execute('rm *')..[[ "这样的方式去保存某些东西(比如它可能提供字符串作为地址)你最终的chunk将是这个样子:

varname = [[ ]]..os.execute('rm *')..[[ ]]

如果你load这个数据,运行结果可想而知的。为了以安全的方式引用任意的字符串,string标准库提供了格式化函数专门提供"%q"选项。它可以使用双引号表示字符串并且可以正确的处理包含引号和换行等特殊字符的字符串。这样一来,我们的序列化函数可以写为:

function serialize (o)
    if type(o) == "number" then
       io.write(o)
    elseif type(o) == "string" then
       io.write(string.format("%q", o))
    else ...
end

原文:LUA一个小巧脚本语言学习笔记

           LUA教程序列化-48

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服