Lua序列化
概念普及
持久化持久化(Persistence),即把内存中的对象保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。?持久化是将程序数据在持久状态和瞬时状态间转换的机制。(应用与游戏,)? JDBC就是一种持久化机制。文件IO也是一种持久化机制。 为什么需要持久化服务呢?那是由于内存本身的缺陷引起的:内存掉电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号,遗憾的是,人们还无法保证内存永不掉电。 持久化方案可以分为关系数据库方案、文件方案、对象数据库方案、 xml数据库方案,目前主流的持久化方案是关系数据库方案,关系数据库方案不仅解决了并发的问题,更重要的是,关系数据库还提供了持久化服务之外的价值:统计分析功能。 序列化一般说到序列化,其实是包含了反序列化。 序列化作用
我们都知道,socket的数据都是以字符串进行传输,而序列化的作用就是将复杂的数据结构转换成字符串。
序列化中的“序”就是有序的意思,有序的字符串序列可以供绝大多数的编程语言解释。而Protocol Buffers就是其中的突出代表。
方便数据存储这个好理解,就是解决一对多的问题。不用序列化可能需要存储多条信息,而序列化可以将多条数据合成一条进行存储;方便数据运维。
不是说序列化效率低下,而是人为在序列化上效率控制上。以在windows(VS2013)下为例,当我们对结构体进行赋值时,当结构体字节小于等于4096时,编译器会将结构体每个值进行一一赋值(这里的值不是真正结构的值,相对汇编来说是4个字节);当结构体字节大于4096时,编译器会直接调用memcpy。这是因为一一赋值的效率会随着字节数的增大而大幅下降。
假如现在数据库保存的是a、b、c三个值的序列化的字符串。但是现在需求发生变化,需要加入d值。那就麻烦了,因为现在要考虑旧数据的兼容问题了。 把Java对象转换为字节序列的过程称为对象的序列化,又叫串行化 把字节序列恢复为Java对象的过程称为对象的反序列化,又叫并行化 关系对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,对象序列化的过程是对象持久化的方法之一,把对象保存到文件中.序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、 主机之间进行。? 持久化往往依赖于数据库,是为了长期存储的。序列化是为了散集和列集做短期存储和数据传递的。 如果按照存储介质和生命周期的长短划分,所有的数据都以两种形式存在,其中一种是保存于内存中的运行时对象,另一种则是存储于持久化物理介质中的文件,比如数据库文件等。数据的持久化关注于相同的数据在不同形态数据之间的转化,解决的是如何将内存对象持久化存储,以及从物理介质中加载数据并创建内存对象。 数据的持久化是序列化的又一个典型的应用,对象只有在序列化之后才能进行持久化存储,从持久化存储介质加载的数据通过反序列化转变成运行时对象。 Lua序列化实例local str_serialize = "" local function serialize (o) str_serialize = str_serialize or "" if o == nil then io.write("nil") str_serialize = str_serialize.."nil" return end if type(o) == "number" then io.write(o) str_serialize = str_serialize..o elseif type(o) == "string" then io.write(string.format("%q",o)) str_serialize = str_serialize..string.format("%q",o) elseif type(o) == "table" then io.write("{n") str_serialize = str_serialize.."{n" for k,v in pairs(o) do io.write(" ["); str_serialize = str_serialize.." [" serialize(k); io.write("] = ") str_serialize = str_serialize.."] = " serialize(v) io.write(",n") str_serialize = str_serialize..",n" end io.write("}") str_serialize = str_serialize.."}" elseif type(o) == "boolean" then io.write( o and "true" or "false" ) str_serialize = str_serialize..(o and "true" or "false") elseif type(o) == "function" then io.write( "function" ) str_serialize = str_serialize.."function" else error("cannot serialize a " .. type(o)) end return end local ddd = {a = 12,b = "Lua",key = "another "one"",d = false} serialize(ddd) print("") print(str_serialize)结果 { ["a"] = 12,["d"] = false,["key"] = "another "one"",["b"] = "Lua",} { ["a"] = 12,} 参考 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |