课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 推荐使用序列化对象的拷贝
  • 推荐使用序列化对象的拷贝

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 上一昆明Java培训机构的老师建议说了对象的浅拷贝问题,试下Cloneable接口就具备了拷贝能力,那我们开思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何处理呢?每个类都系而一个clone方法, 且还有深拷贝?想想这是何等巨大的工作量呀!是否有更好的方法呢?

    其实,可以通过序列化方式来处理,在内存中通过字节流的拷贝来实现,也就是把母对象写到一个字节流中,再从字节流中将其读出来,这样就可以重建一个对象了,该新对象与母对象之间不存在引用共享的问题,也就相当于 拷贝了一个对象,代码如下:

    1 import java.io.ByteArrayInputStream;

    2 import java.io.ByteArrayOutputStream;

    3 import java.io.IOException;

    4 import java.io.ObjectInputStream;

    5 import java.io.ObjectOutputStream;

    6 import java.io.Serializable;

    7

    8 public final class CloneUtils {

    9    private CloneUtils() {

    10        throw new Error(CloneUtils.class + " cannot instance ");

    11    }

    12

    13    //拷贝一个对象

    14    public static <T extends Serializable> T clone(T obj) {

    15        //拷贝产生的对象

    16        T cloneObj = null;

    17        try {

    18            //读取对象字节数据

    19            ByteArrayOutputStream baos = new ByteArrayOutputStream();

    20            ObjectOutputStream oos = new ObjectOutputStream(baos);

    21            oos.writeObject(cloneObj);

    22            oos.close();

    23            //分配内存空间,写入原始对象,生成新对象

    24            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

    25            ObjectInputStream ois = new ObjectInputStream(bais);

    26            //返回新对象,并做类型转换

    27            cloneObj = (T) ois.readObject();

    28            ois.close();

    29        } catch (ClassNotFoundException e) {

    30            e.printStackTrace();

    31        } catch (IOException e) {

    32            e.printStackTrace();

    33        }

    34        return cloneObj;

    35

    36    }

    37

    38 }

    此工具类要求被拷贝的对象实现了Serializable接口,否则是没办法拷贝的(当然,使用反射是另一种技巧),上一建议中的例子只是稍微修改一下即可实现深拷贝,代码如下

    public class Person implements Serializable{

    private static final long serialVersionUID = 4989174799049521302L;

    /*删除掉clone方法,其它代码保持不变*/

    }

    被拷贝的类只要实现Serializable这个标志性接口即可,不需要任何实现,当然serialVersionUID常量还是要加上去的,然后我们就可以通过CloneUtils工具进行对象的深拷贝了,用词方法进行对象拷贝时需要注意两点:

    对象的内部属性都是可序列化的:如果有内部属性不可序列化,则会抛出序列化异常,这会让调试者很纳闷,生成一个对象怎么回出现序列化异常呢?从这一点考虑,也需要把CloneUtils工具的异常进行细化处理。

    注意方法和属性的特殊修饰符:比如final,static变量的序列化问题会被引入对象的拷贝中,这点需要特别注意,同时transient变量(瞬态变量,不进行序列化的变量)也会影响到拷贝的效果。当然,采用序列化拷贝时还有一个更简 单的方法,即使用Apache下的commons工具包中SerializationUtils类,直接使用更加简洁.

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:【昆明Java培训机构】避免对象的浅拷贝

下一篇:覆写equals方法时不要识别不出自己

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56