java 之 利用序列化实现深拷贝

2017-08-16  本文已影响0人  V5程

我们知道 java 在 new 一个对象的时候,其代价是比 clone 一个对象的代价是要高的,但是拷贝也不能直接用,因 java 的拷贝分为深拷贝和浅拷贝, 虽然深拷贝可以解决浅拷贝的问题,但是也会在深拷贝的时候 new 对象。有一个比较好的额代替方法是:利用序列化实现对对象的拷贝。

在内存中通过字节流的拷贝是比较容易的实现的,把原对象写入到一个字节流中,再从字节流中将其读取出来,这样读取到的对象就是原对象的一个 clone 体,而且不存浅拷贝的问题,是一个真正的深拷贝。


public class CloneUtils {  

        @SuppressWarnings("unchecked")   
        public staticT clone(T obj){
        T cloneObj = null;
        try {
          //写入字节流
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream obs = new ObjectOutputStream(out);
            obs.writeObject(obj);
            obs.close();

            //分配内存,写入原始对象,生成新对象
            ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(ios);

            //返回生成的新对象
            cloneObj = (T) ois.readObject();
            ois.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return cloneObj;
    }

使用该工具类的对象必须要实现Serializable接口,否则是没有办法实现克隆的。

上一篇 下一篇

猜你喜欢

热点阅读