接下来看下深克隆:
package com.djk.design.factory.clone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class DeepClone implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 8006468601991987083L;
private String name;
private int age;
private Teacher teacher;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public DeepClone getDeepClone()
{
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (DeepClone)ois.readObject();
} catch (Exception e) {
return null;
}
}
@Override
public String toString()
{
return "DeepClone [age=" + age + ", name=" + name + ", teacher="
+ teacher + "]";
}
}
package com.djk.design.factory.clone;
import java.io.Serializable;
public class Teacher implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -8420832563290777627L;
private String terchearName;
private int terchearAge;
public String getTerchearName() {
return terchearName;
}
public void setTerchearName(String terchearName) {
this.terchearName = terchearName;
}
public int getTerchearAge() {
return terchearAge;
}
public void setTerchearAge(int terchearAge) {
this.terchearAge = terchearAge;
}
@Override
public String toString()
{
return "Teacher [terchearAge=" + terchearAge + ", terchearName="
+ terchearName + "]";
}
}
上面利用了对象的序列化完成了深克隆,深克隆将克隆对象里面引用的对象也克隆了一份,要注意的是对里面引用的对象也需要实现序列化
序列化加序列号的原因是:比如一个对象在A版本有个属性是String 类型的name,到了B版本,这个对象的这个属性没了或者增加了别的属性,这时候将之前A版本的对象进行反克隆的时候会报错,因为java发现2个版本的克隆对象发生了变化,解决的方法就是加个序列号,所以加序列号的目的是为了克隆对象的兼容性.
序列化的时候注意:静态的属性不会被序列化 ,被transient修饰的属性不会被序列化。