企业网站特色建设,wordpress 取消评论审核,阿亮seo技术顾问,百度指数分析工具建议44#xff1a; 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题#xff0c;实现Cloneable接口就具备了拷贝能力#xff0c;那我们来思考这样一个问题#xff1a;如果一个项目中有大量的对象是通过拷贝生成的#xff0c;那我们该如何处理#xff1f;每个…建议44 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题实现Cloneable接口就具备了拷贝能力那我们来思考这样一个问题如果一个项目中有大量的对象是通过拷贝生成的那我们该如何处理每个类都写一个clone方法并且还要深拷贝想想看这是何等巨大的工作量呀是否有更好的方法呢 其实可以通过序列化方式来处理在内存中通过字节流的拷贝来实现也就是把母对象写到一个字节流中再从字节流中将其读出来这样就可以重建一个新对象了该新对象与母对象之间不存在引用共享的问题也就相当于深拷贝了一个新对象代码如下 1 public class CloneUtils { 2 // 拷贝一个对象 3 SuppressWarnings(unchecked) 4 public static T extends Serializable T clone(T obj) { 5 // 拷贝产生的对象 6 T clonedObj null; 7 try { 8 // 读取对象字节数据 9 ByteArrayOutputStream baos new ByteArrayOutputStream();
10 ObjectOutputStream oos new ObjectOutputStream(baos);
11 oos.writeObject(obj);
12 oos.close();
13 // 分配内存空间写入原始对象生成新对象
14 ByteArrayInputStream bais new ByteArrayInputStream(baos.toByteArray());
15 ObjectInputStream ois new ObjectInputStream(bais);
16 //返回新对象并做类型转换
17 clonedObj (T)ois.readObject();
18 ois.close();
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 return clonedObj;
23 }
24 } 此工具类要求被拷贝的对象必须实现Serializable接口否则是没办法拷贝的当然使用反射那是另外一种技巧上一个建议中的例子只要稍微修改一下即可实现深拷贝代码如下 1 public class CloneUtils { 2 // 拷贝一个对象 3 SuppressWarnings(unchecked) 4 public static T extends Serializable T clone(T obj) { 5 // 拷贝产生的对象 6 T clonedObj null; 7 try { 8 // 读取对象字节数据 9 ByteArrayOutputStream baos new ByteArrayOutputStream();
10 ObjectOutputStream oos new ObjectOutputStream(baos);
11 oos.writeObject(obj);
12 oos.close();
13 // 分配内存空间写入原始对象生成新对象
14 ByteArrayInputStream bais new ByteArrayInputStream(baos.toByteArray());
15 ObjectInputStream ois new ObjectInputStream(bais);
16 //返回新对象并做类型转换
17 clonedObj (T)ois.readObject();
18 ois.close();
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 return clonedObj;
23 }
24 } 此工具类要求被拷贝的对象必须实现Serializable接口否则是没办法拷贝的当然使用反射那是另外一种技巧上一个建议中的例子只要稍微修改一下即可实现深拷贝代码如下 1 class Person implements Serializable{
2 private static final long serialVersionUID 1611293231L;
3 /*删除掉clone方法其他代码保持不变*/
4 } 上去的然后我们就可以通过CloneUtils工具进行对象的深拷贝了。用此方法进行对象拷贝时需要注意两点 1对象的内部属性都是可序列化的 如果有内部属性不可序列化则会抛出序列化异常这会让调试者很纳闷生成一个对象怎么会出现序列化异常呢从这一点来考虑也需要把CloneUtils工具的异常进行细化处理。 2注意方法和属性的特殊修饰符 比如final、static变量的序列化问题会被引入到对象拷贝中来参考第1章这点需要特别注意同时transient变量瞬态变量不进行序列化的变量也会影响到拷贝的效果。 当然采用序列化方式拷贝时还有一个更简单的办法即使用Apache下的commons工具包中的SerializationUtils类直接使用更加简洁方便。 转载于:https://www.cnblogs.com/DreamDrive/p/5430981.html