1.什么是序列化和反序列化?
Seriallization(序列化)是一种将对象以一连串的字节描述的过程;
反序列化deserialization是一种将这些字节重建成一个对象的过程.
2.什么情况下需要序列化?
a.当你想把内存中的对象保存到一个文件中或者数据库中的时候
b.当你想用套接字在网络上传送对象的时候
c.当你想通过RMI传输对象的时候。
1.对象的持久化(Persistence)
对象持久化就是让对象的生存期超越使用对象的程序的运行期。将对象存储在可持久保存的存储介质上,在实际应用中,运用相应的对象持久化框架,将业务数据以对象的方式保存在数据库中,如比较早的Hibernate。在一定周期内保持不变就是持久化,持久化是针对时间来说的。数据库中的数据就是持久化了的数据,只要你不去删除或修改。比如在IE浏览器中一次Session会话中Session对象变量也是不变的,是Session容器中持久化。对象持久化的方式有很多种,根据周期不同有,page,Session,Application。
通俗点理解就是,把对象当做一快鲜肉,不做持久化处理,这块肉很快就是变质不能用了,做持久化处理,就会把鲜肉放到冷库中保存,这样可以保存相当长的时间。
持久化是一种对象服务,就是把内存中的对象保存到外存中,让以后能够取回。需要实现至少3个接口:
void Save(object o) 把一个对象保存到外存中
Object Load(object oid) 通过对象标识从外存中取回对象
boolExists(object oid) 检查外存中是否存在某个对象
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的:
内存掉电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号,遗憾的是,人们还无法保证内存永不掉电。内存过于昂贵,与硬盘、磁带、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。
2.对象的序列化(Serialization)
JVM 向我们屏蔽了内存操作相关的信息,我们并不知道数据是以什么样的形式来存储和组织的,当对象需要进行传输时,java提供了序列化的方法方便我们对数据进行传输操作。对象序列化后的数据格式可以是二进制,可以是XML,也可以是JSON等任何格式,反序列化则是相反的操作。序列化是为了解决对象的传输问题,当传输一个对象时,则需要实现2个接口:
void Serialize(Stream stream,object o) 把对象序列化到流中
object Deserialize(Stream stream) 把流反序列化成对象
这种传输可以是线程之间、进程之间、内存外存之间、主机之间的,凡是可以持久化的对象都可以序列化。
总的来说,对象持久化和对象序列化是两个完全不同的应用场景,尽管你也可以说将一个对象序列化后存储在数据库中,但是你也不能说是对象持久化。