Lua中的持久化和序列化详解

 更新时间:2014年09月27日 15:22:06   投稿:junjie  
这篇文章主要介绍了Lua中的持久化和序列化详解,本文详细讲解了Lua中的持久化和序列化,并给出代码实例,需要的朋友可以参考下

持久化

持久化(Persistence),即把内存中的对象保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

持久化是将程序数据在持久状态和瞬时状态间转换的机制。(应用与游戏,)
JDBC就是一种持久化机制。文件IO也是一种持久化机制。

为什么需要持久化服务呢?那是由于内存本身的缺陷引起的:内存掉电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号,遗憾的是,人们还无法保证内存永不掉电。

持久化方案可以分为关系数据库方案、文件方案、对象数据库方案、 xml数据库方案,目前主流的持久化方案是关系数据库方案,关系数据库方案不仅解决了并发的问题,更重要的是,关系数据库还提供了持久化服务之外的价值:统计分析功能。

序列化

将对象的状态信息转换为可以存储或传输的形式的过程。

在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

目的

1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

把Java对象转换为字节序列的过程称为对象的序列化,又叫串行化
把字节序列恢复为Java对象的过程称为对象的反序列化,又叫并行化

对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。

关系

对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,对象序列化的过程是对象持久化的方法之一,把对象保存到文件中。

序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、 主机之间进行。

持久化往往依赖于数据库,是为了长期存储的。序列化是为了散集和列集做短期存储和数据传递的。

如果按照存储介质和生命周期的长短划分,所有的数据都以两种形式存在,其中一种是保存于内存中的运行时对象,另一种则是存储于持久化物理介质中的文件,比如数据库文件等。数据的持久化关注于相同的数据在不同形态数据之间的转化,解决的是如何将内存对象持久化存储,以及从物理介质中加载数据并创建内存对象。

数据的持久化是序列化的又一个典型的应用,对象只有在序列化之后才能进行持久化存储,从持久化存储介质加载的数据通过反序列化转变成运行时对象。

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,
 ["d"] = false,
 ["key"] = "another \"one\"",
 ["b"] = "Lua",
}

相关文章

  • 举例说明Lua中元表和元方法的使用

    举例说明Lua中元表和元方法的使用

    这篇文章主要介绍了举例说明Lua中元表和元方法的使用,文中--两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]],需要的朋友可以参考下
    2015-07-07
  • Lua中的持久化和序列化详解

    Lua中的持久化和序列化详解

    这篇文章主要介绍了Lua中的持久化和序列化详解,本文详细讲解了Lua中的持久化和序列化,并给出代码实例,需要的朋友可以参考下
    2014-09-09
  • 深入谈谈lua中神奇的table

    深入谈谈lua中神奇的table

    table 在lua中是一个非常常用的数据结构,可以用来存放各种类型的元素,下面这篇文章就来给大家介绍了关于lua中神奇的table的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-07-07
  • Lua之协同程序coroutine代码实例

    Lua之协同程序coroutine代码实例

    这篇文章主要介绍了Lua之协同程序coroutine代码实例,本文给出的代码示例较为复杂,需要对Lua协同程序有一定的了解方能看懂,需要的朋友可以参考下
    2015-04-04
  • Lua中的string库(字符串函数库)总结

    Lua中的string库(字符串函数库)总结

    这篇文章主要介绍了Lua中的string库(字符串函数库)总结,本文讲解了string库的操作方法,着重讲解了string.format方法,需要的朋友可以参考下
    2014-11-11
  • Lua变量类型简明总结

    Lua变量类型简明总结

    这篇文章主要介绍了Lua变量类型简明总结,本文总结了Lua中的6种变量类型,并一一说明,需要的朋友可以参考下
    2014-10-10
  • 详解Lua中的元表和元方法

    详解Lua中的元表和元方法

    Lua中的元表(Metatable)和元方法(Metamethods)是Lua语言中的重要概念,它们允许我们对对象和操作进行自定义,本文讲给大家详细介绍一下Lua中的元表和元方法,需要的朋友可以参考下
    2023-09-09
  • 获取Lua表结构(table)数据实例

    获取Lua表结构(table)数据实例

    这篇文章主要介绍了获取Lua表结构(table)数据实例,本文使用lua_gettable函数获取表结构,需要的朋友可以参考下
    2014-09-09
  • Lua学习笔记之函数、变长参数、closure(闭包)、select等

    Lua学习笔记之函数、变长参数、closure(闭包)、select等

    这篇文章主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下
    2015-04-04
  • Lua教程(十三):弱引用table

    Lua教程(十三):弱引用table

    这篇文章主要介绍了Lua教程(十三):弱引用table,一个table的弱引用类型是通过其元表的__mode字段来决定的,如果该值为包含字符"k",那么table就是key弱引用,如果包含"v",则是value弱引用,如果两个字符均存在,就是key/value弱引用,需要的朋友可以参考下
    2015-04-04

最新评论