?????????我們可以利用clone方法來實現對象只見的復制,但對于比較復雜的對象(比如對象中包含其他對象,其他對象又包含別的對象.....)這樣我們必須進行層層深度clone,每個對象需要實現 cloneable接口,比較麻煩,那就繼續學習下一個序列化方法。
創建
/*
*?文?件?名:?A.java?版?權:?Unis?Cloud?Information?Technology?Co.,?Ltd.?Copyright
*?2015,?All?rights?reserved?描?述:??修?改?人:?Administrator?修改時間:?2015-11-10
*?跟蹤單號:??修改單號:??修改內容:?
*/
package?com.hubin.supers;
import?java.io.Serializable;
/**
*??
*
*?@author?Administrator
*?@version?[版本號,?2015-11-10]
*?@see?[相關類/方法]
*?@since?[產品/模塊版本]
*/
public?class?A?implements?Serializable?{
private?String?name;
private?int?age;
/**
*?@return?返回?name
*/
public?String?getName()?{
return?name;
}
/**
*?@param?對name進行賦值
*/
public?void?setName(String?name)?{
this.name?=?name;
}
/**
*?@return?返回?age
*/
public?int?getAge()?{
return?age;
}
/**
*?@param?對age進行賦值
*/
public?void?setAge(int?age)?{
this.age?=?age;
}
/**
*?@return
*/
@Override
public?String?toString()?{
return?"A?[name="?+?name?+?",?age="?+?age?+?"]";
}
}
創建B類:
/*
*?文?件?名:?B.java?版?權:?Unis?Cloud?Information?Technology?Co.,?Ltd.?Copyright
*?2015,?All?rights?reserved?描?述:??修?改?人:?Administrator?修改時間:?2015-11-10
*?跟蹤單號:??修改單號:??修改內容:?
*/
package?com.hubin.supers;
import?java.io.Serializable;
/**
*??
*
*?@author?Administrator
*?@version?[版本號,?2015-11-10]
*?@see?[相關類/方法]
*?@since?[產品/模塊版本]
*/
public?class?B?implements?Serializable?{
private?A?a;
private?String?name;
/**
*?@return?返回?a
*/
public?A?getA()?{
return?a;
}
/**
*?@param?對a進行賦值
*/
public?void?setA(A?a)?{
this.a?=?a;
}
/**
*?@return?返回?name
*/
public?String?getName()?{
return?name;
}
/**
*?@param?對name進行賦值
*/
public?void?setName(String?name)?{
this.name?=?name;
}
/**
*?@return
*/
@Override
public?String?toString()?{
return?"B?[a="?+?a?+?",?name="?+?name?+?"]";
}
}
創建測試Desc類:
/*
*?文?件?名:?Desc.java?版?權:?Unis?Cloud?Information?Technology?Co.,?Ltd.?Copyright
*?2015,?All?rights?reserved?描?述:??修?改?人:?Administrator?修改時間:?2015-11-10
*?跟蹤單號:??修改單號:??修改內容:?
*/
package?com.hubin.supers;
import?java.io.ByteArrayInputStream;
import?java.io.ByteArrayOutputStream;
import?java.io.ObjectInputStream;
import?java.io.ObjectOutputStream;
import?java.util.ArrayList;
import?java.util.List;
/**
*
*?@author?Administrator
*?@version?[版本號,?2015-11-10]
*?@see?[相關類/方法]
*?@since?[產品/模塊版本]
*/
public?class?Desc?{
public?static?void?main(String[]?args)?throws?Exception?{
A?a?=?new?A();
a.setName("張三");
a.setAge(10);
B?b?=?new?B();
b.setA(a);
b.setName("南京");
List?list?=?new?ArrayList();
list.add(b);
ByteArrayOutputStream?byteOut?=?new?ByteArrayOutputStream();
ObjectOutputStream?out?=?new?ObjectOutputStream(byteOut);
out.writeObject(list);
ByteArrayInputStream?byteIn?=?new?ByteArrayInputStream(
byteOut.toByteArray());
ObjectInputStream?in?=?new?ObjectInputStream(byteIn);
List?list1?=?(List)?in.readObject();
list1.get(0).getA().setName("李四");
System.out.println(list.get(0));
System.out.println(list1.get(0));
}
}
結果:
B [a=A [name=張三, age=10], name=南京]
B [a=A [name=李四, age=10], name=南京]
從結果可以看到當修改序列化后的對象的值不會影響原先對象的值,所以可以通過序列化進行深度克隆