昆明java培训
达内昆明广州春城路

18487146383

热门课程

推荐使用序列化对象的拷贝

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

上一昆明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未来的发展走向

昆明java培训机构:java学完可以干什么!

昆明java培训机构:如何搞定BAT和华为offer?有这份攻略就够了!

昆明java培训机构:学Java别担心枯燥和无聊

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货