Lua中的持久化和序列化详解
持久化
持久化(Persistence),即把内存中的对象保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。(应用与游戏,)
JDBC就是一种持久化机制。文件IO也是一种持久化机制。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的:内存掉电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号,遗憾的是,人们还无法保证内存永不掉电。
持久化方案可以分为关系数据库方案、文件方案、对象数据库方案、xml数据库方案,目前主流的持久化方案是关系数据库方案,关系数据库方案不仅解决了并发的问题,更重要的是,关系数据库还提供了持久化服务之外的价值:统计分析功能。
序列化
将对象的状态信息转换为可以存储或传输的形式的过程。
在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
目的
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
把Java对象转换为字节序列的过程称为对象的序列化,又叫串行化
把字节序列恢复为Java对象的过程称为对象的反序列化,又叫并行化
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
关系
对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,对象序列化的过程是对象持久化的方法之一,把对象保存到文件中。
序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、主机之间进行。
持久化往往依赖于数据库,是为了长期存储的。序列化是为了散集和列集做短期存储和数据传递的。
如果按照存储介质和生命周期的长短划分,所有的数据都以两种形式存在,其中一种是保存于内存中的运行时对象,另一种则是存储于持久化物理介质中的文件,比如数据库文件等。数据的持久化关注于相同的数据在不同形态数据之间的转化,解决的是如何将内存对象持久化存储,以及从物理介质中加载数据并创建内存对象。
数据的持久化是序列化的又一个典型的应用,对象只有在序列化之后才能进行持久化存储,从持久化存储介质加载的数据通过反序列化转变成运行时对象。
Lua序列化实例
localstr_serialize=""
localfunctionserialize(o)
str_serialize=str_serializeor""
ifo==nilthen
io.write("nil")
str_serialize=str_serialize.."nil"
return
end
iftype(o)=="number"then
io.write(o)
str_serialize=str_serialize..o
elseiftype(o)=="string"then
io.write(string.format("%q",o))
str_serialize=str_serialize..string.format("%q",o)
elseiftype(o)=="table"then
io.write("{\n")
str_serialize=str_serialize.."{\n"
fork,vinpairs(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.."}"
elseiftype(o)=="boolean"then
io.write(oand"true"or"false")
str_serialize=str_serialize..(oand"true"or"false")
elseiftype(o)=="function"then
io.write("function")
str_serialize=str_serialize.."function"
else
error("cannotserializea"..type(o))
end
return
end
localddd={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,
["d"]=false,
["key"]="another\"one\"",
["b"]="Lua",
}
相关文章
- MySQL详解:索引的介绍和原理分析
- 一文详解Redis中的持久化
- 关闭redis持久化功能详解数据库
- Redis 学习之持久化机制、发布订阅、虚拟内存详解程序员
- MySQL binlog日志操作详解数据库
- 某互联网公司广告平台技术架构详解架构师
- Redis详解(七)—— AOF 持久化大数据
- Redis详解(六)—— RDB 持久化大数据
- Python中的数据类型详解编程语言
- Akka(14): 持久化模式:PersistentActor详解编程语言
- java的双缓冲技术详解编程语言
- 如何实现ActiveMq的Topic的持久订阅详解编程语言
- Java数据持久层框架 MyBatis之API学习二(入门)详解编程语言
- Java数据持久层框架 MyBatis之API学习五(Mapper XML 文件)详解编程语言
- SAP的PI日志查看工具详解编程语言
- C++ binary_search(STL binary_search)二分查找算法详解
- Python推导式(列表推导式、元组推导式、字典推导式和集合推导式)详解
- Java break语句详解
- Oracle函数介绍:返回参数详解(oracle函数返回参数)
- Mongodb的存储方式简介:NoSQL数据库持久化存储方法详解(mongodb存储方式)
- MYSQL原子性保障方法详解(mysql中保证原子性)
- MySQL实现交集查询方法详解(mysql中交集的实现)
- 基于request.getAttribute与request.getParameter的区别详解
- android浏览器之多窗口方案详解