前两天做项目的时候需要对某个对象进行复制,但是复制的对象不需要源对象的某些属性值,便在论坛上提问,最后根据大家的回答找到一个比较适合自己的方法,遂记录下来。同时也谢谢各位的回答。
有如下这些类(实际的对象之间的关联要比这个复杂):
class A {
private Long id;
private List<B> listB;
private D d;
......
}
class B {
private Long id;
private A a;
private List<C> listC;
......
}
class C {
private Long id;
private B b;
......
}
class D {
private Long id;
private A a;
......
}
现在我需要将A进行复制,但是不需要所有对象的id属性的值。
最后我选择了通过序列化来复制对象,方法如下:
首先建立一个基类,基类实现Serializable接口,并有一个栏位“id“,将”id“用transient修饰
public class Entity implements Serializable {
private transient Long id;
//getter and setter
...
}
然后将所有类都继承这个基类,如果我需要对A进行复制,则通过下面这段代码即可
public static Object deepCopy(Object object) throws IOException, ClassNotFoundException{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//Serialize
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(object);
oos.close();
bos.close();
//Deserialize
byte[] data = bos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
Evaluation copy = (Evaluation) ois.readObject();
ois.close();
bais.close();
return copy ;
}
deepCopy方法就是用序列化的方法来实现对象的深拷贝,其返回的对象即为我需要的这个对象的拷贝。
我觉得这种方法算是需要的代码量最小的,对现在的项目改动最少的方法。
如果大家有更好的方法或者觉得这个方法有改进的地方,请留言。
问题的地址:http://www.iteye.com/problems/120240
参考资料:
http://www.oschina.net/translate/serialization-in-java
http://liuwang126.iteye.com/blog/272595
http://kentkwan.iteye.com/blog/739514
http://my1988.2219.heart.blog.163.com/blog/static/8383725220121190213943/