[TOC]
转载原文: https://blog.csdn.net/u011630575/article/details/50752897
序列化是什么
序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
是对象永久化的一种机制
确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。 只有序列化的对象才可以存储在存储设备上。
上面也就说明了,是对 对象的一种此刻状态的持久化操作。
序列化和反序列化
序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。
反序列化就是打开字节流并重构对象。
对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。
序列化的什么特点
如果某个类能够被序列化,其子类也可以被序列化。
声明为static和transient类型的成员数据不能被序列化。
因为static代表类的状态, transient代表对象的临时数据。
什么时候使用序列化
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
Java序列化的方式
-
一种是实现Serializable接口 使用该方式非常简单,通过重写该接口预置的4个方法,可以达到对序列化的控制。不重写这些方法,也可以自动序列化,非常方便。
-
另一种是实现Exteranlizable接口。 不像Serializable接口只是一个标记接口,里面的接口方法都是可选的(可实现可不实现,如果不实现则启用其自动序列化功能),而Externalizable接口不是一个标记接口,它强制你自己动手实现串行化和反串行化方法。它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是要求必须重写两个方法。Externalizable对小数目对象有效的多。但是对大量对象,或者重复对象,则效率低。
「真诚赞赏,手留余香」