串行化:
对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来「记录自己」,这个过程叫对象的串行化(Serialization)。
串行化对象:1、该对象的类必须实现Serializable接口。
2:该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。无法保存对象的瞬时状态,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。 (注:保存任何的成员方法和静态的成员变量没有任何的意义,因为对象的类已经完整的保存了他们)
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
一个程序结束时,所有的内存都会清空。为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。序列化的思想是 “冻结” 对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后 “解冻” 状态,重新获得可用的 Java 对象。
什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
利用序列化深度复制:
把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做 “解冻”或者“回鲜(depicking)”过程。
应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝,Java咸菜还可以回鲜。
在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里(腌成咸菜),再从流里读出来(把咸菜回鲜),便可以重建对象。
深克隆的例子:
public class Account implements java.lang.Cloneable{
public Object clone() throws CloneNotSupportedException {
Account temp = (Account) super.clone();
temp.createDate = (Date) this.createDate.clone();//深克隆不是复制引用,而是把引用对象也new出来,复制的是内容
return temp;
}
}