通过序列化拷贝对象

本文介绍了一种通过序列化实现对象深拷贝的方法,该方法能够排除特定属性(如ID),适用于复杂对象间的复制需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天做项目的时候需要对某个对象进行复制,但是复制的对象不需要源对象的某些属性值,便在论坛上提问,最后根据大家的回答找到一个比较适合自己的方法,遂记录下来。同时也谢谢各位的回答。

 

有如下这些类(实际的对象之间的关联要比这个复杂):

 

    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/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值