最近很忙,上次发的博客还没编辑。
换的新工作,每天加班。也没用什么高深技术。不过这样倒好。就操作纯JAVA,没那么多框架什么的。省了很多心。
最近做的一些业务中有需要用到序列化存储等一系列的技术。现在不忙了。回头想想。发现深度克隆可以如此简单。
不过。需要克隆的类必须都实现Serializable。这点我也没办法。因为追求的是简单实现嘛。
废话不多说了。
首先,我们要建立两个类,Group和User
小童鞋,不要急,不要问我CloneHelper是哪来的。。。
下面的代码很丑。。。我实在是太懒了。。。对于DEMO。。。还是。。。凑合凑合吧。。
好了。我们要建立测试。
什么?没用测试框架?
呃。。。好吧。。。我不够敏捷。。。不是TDD。。。
因为我一开始就想好怎么写了。。。
以上代码还需要更多测试。我就稍微测试了一下。发现是可行的。
总结:
使用ObjectOutputStream和ObjectInputStream来进行深度克隆。非常简单。仅需要一点点代码。
换的新工作,每天加班。也没用什么高深技术。不过这样倒好。就操作纯JAVA,没那么多框架什么的。省了很多心。
最近做的一些业务中有需要用到序列化存储等一系列的技术。现在不忙了。回头想想。发现深度克隆可以如此简单。
不过。需要克隆的类必须都实现Serializable。这点我也没办法。因为追求的是简单实现嘛。
废话不多说了。
首先,我们要建立两个类,Group和User
/**
* 用户分组
* @author wilber
* */
public class Group implements Cloneable,Serializable {
/**
*
*/
private static final long serialVersionUID = -8758194056672315373L;
private String name;
private List<User> users = new ArrayList<User>();
public Group clone(){
return (Group)CloneHelper.clone(this);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
/**
* 用户
* @author wilber
* */
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1849599401392558181L;
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
小童鞋,不要急,不要问我CloneHelper是哪来的。。。
下面的代码很丑。。。我实在是太懒了。。。对于DEMO。。。还是。。。凑合凑合吧。。
/**
* 克隆辅助类
* @author wilber
* */
public class CloneHelper {
/**
* 克隆一个指定的对象实例,该对象及其引用对象需要实现Serializable
* @param Object
* @return Object
* */
public static Object clone(Object object){
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
oos = new ObjectOutputStream(byteOut);
oos.writeObject(object);
ois = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray()));
return ois.readObject();
} catch (IOException e) {
throw new RuntimeException("Clone Object failed in IO.",e);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Class not found.",e);
}finally{
try{
if(oos != null) oos.close();
if(ois != null) ois.close();
}catch(IOException e){
//Do Nothing
}
}
}
}
好了。我们要建立测试。
public class TestCloneMain {
/**
* @param args
*/
public static void main(String[] args) {
Group group = createGroupInstance();
Group cloneGroup = group.clone();
System.out.println(cloneGroup == group);
group.setName("GroupI");
System.out.println(cloneGroup.getName());
}
private static Group createGroupInstance(){
Group group = new Group();
group.setName("group");
User user1 = new User();
user1.setName("wilber");
user1.setPassword("123456");
User user2 = new User();
user2.setName("daisy");
user2.setPassword("654321");
group.getUsers().add(user1);
group.getUsers().add(user2);
return group;
}
}
什么?没用测试框架?
呃。。。好吧。。。我不够敏捷。。。不是TDD。。。
因为我一开始就想好怎么写了。。。
以上代码还需要更多测试。我就稍微测试了一下。发现是可行的。
总结:
使用ObjectOutputStream和ObjectInputStream来进行深度克隆。非常简单。仅需要一点点代码。