将对象变量的值及引用型对象变量的值全部写进输出流中,再将输入流中的值读进内存重构出对象(Object),在将该对象强转为具体对象时将按照该对象类中定义的结构树进行再次重构出该对象,在此过程中对象的变量将按照读进内存的字段值进行重新初始化。
代码如下:
序列化与反序列化 深度克隆
Java代码
private static Object cloneObject(Object obj) throws Exception{
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(obj);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in =new ObjectInputStream(byteIn);
return in.readObject();
============================================================================================================
public class CloneTest3 {
public static void main(String[] args) throws Exception {
Teacher3 t = new Teacher3();
t.setAge(40);
t.setName("Teacher Zhang");
Student3 s1 = new Student3();
s1.setAge(20);
s1.setName("zhangsan");
s1.setTeacher(t);
Student3 s2 = (Student3) s1.deepCopy();
System.out.println(s2.getAge());
System.out.println(s2.getName());
System.out.println("-----------------------");
System.out.println(s2.getTeacher().getAge());
System.out.println(s2.getTeacher().getName());
s2.getTeacher().setAge(50);
s2.getTeacher().setName("Teacher Li");
System.out.println(s1.getTeacher().getAge());
System.out.println(s1.getTeacher().getName());
}
}
class Teacher3 implements Serializable {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student3 implements Serializable {
private int age;
private String name;
private Teacher3 teacher;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher3 getTeacher() {
return teacher;
}
public void setTeacher(Teacher3 teacher) {
this.teacher = teacher;
}
public Object deepCopy() throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
运行结果:
/*zhangsan
-----------------------
40
Teacher Zhang
40
Teacher Zhang*/