利用序列化與還原序列化對Java對象進行深度複製

來源:互聯網
上載者:User

來源  http://lhg803.iteye.com/blog/407270

JDK的API中的java.lang.Object和Cloneable介面要完美實現深度clone時,都需要針對具體的類改代碼。
採用序列化與還原序列化可以完全獨立於具體的某個類進行深度複製。

採用此方法做深度拷貝時,要求所有對象implements Serializable,否則報java.io.NotSerializableException異常。

執行個體:

 學生類

package cup1;

import java.io.Serializable;

public class Student implements Serializable{
private String name;
private String tel;
private int age;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}

教師類,包括一個學生對象列表

package cup1;

import java.io.Serializable;
import java.util.List;

public class Teacher implements Serializable{
private String name;
private int age;
private List<Student> stuList;

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 List<Student> getStuList() {
return stuList;
}
public void setStuList(List<Student> stuList) {
this.stuList = stuList;
}

}

測試類別,包括main方法和deepClone對象深度複製方法

package cup1;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Test {

public static void main(String[] args) {
Student s1 = new Student();
s1.setName("Wang");
s1.setAge(25);
s1.setTel("110");
Student s2 = new Student();
s2.setName("Li");
s2.setAge(35);
s2.setTel("119");

Teacher t = new Teacher();
t.setName("Zhang");
t.setAge(50);
List<Student> stuList = new ArrayList<Student>();
stuList.add(s1);
stuList.add(s2);
t.setStuList(stuList);
System.out.println("-------original-------");
System.out.println("t: " + t);
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
System.out.println("-------after clone-------");
Teacher t2 = (Teacher) deepClone(t);
System.out.println("t2: " + t2);
System.out.println("t: " + t);

Student s3 = t2.getStuList().get(0);
Student s4 = t2.getStuList().get(1);
System.out.println("s3: " + s3);
System.out.println("s1: " + s1);
System.out.println("s4: " + s4);
System.out.println("s2: " + s2);

System.out.println("-------after t2 change-------");
t2.setAge(55);
t2.setName("Zhao");

System.out.println("t2 Name: " + t2.getName() + " t2 age" + t2.getAge());
System.out.println("t Name: " + t.getName() + " t age" + t.getAge());

}

public static Object deepClone(Object src) {
Object dst = null;

try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(out);
oo.writeObject(src);

ByteArrayInputStream in = new ByteArrayInputStream(
out.toByteArray());
ObjectInputStream oi = new ObjectInputStream(in);
dst = oi.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return dst;
}
}

輸出結果

-------original-------
t: cup1.Teacher@1fb8ee3
s1: cup1.Student@61de33
s2: cup1.Student@14318bb
-------after clone-------
t2: cup1.Teacher@12ac982
t: cup1.Teacher@1fb8ee3
s3: cup1.Student@1389e4
s1: cup1.Student@61de33
s4: cup1.Student@c20e24
s2: cup1.Student@14318bb
-------after t2 change-------
t2 Name: Zhao t2 age55
t Name: Zhang t age50
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.