前两天做项目的时候需要对某个对象进行复制,但是复制的对象不需要源对象的某些属性值,便在论坛上提问,最后根据大家的回答找到一个比较适合自己的方法,遂记录下来。同时也谢谢各位的回答。
?
有如下这些类(实际的对象之间的关联要比这个复杂):
?
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/
?
原文:http://julianyuan.iteye.com/blog/2163252