`
jianchen
  • 浏览: 343098 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深度克隆问题

阅读更多

曾经面对想完全克隆出一个java对象出来。前面谈ArrayList的克隆问题,我记得当时我就傻傻的自己把被克隆对象的属性一一赋值到了一个新创建的对象中去。这真的是一件体力活啊。如果对象网络很复杂,所做的工作绝不会轻松哈。当时想到把对象图保存到文件中进行序列化。现在还找到一个不错的方法。直接使用管道流,将对象写入再读出,省却了序列化的步骤。找个时间来测验一下这两种方法,谁的效率更高。先把代码贴上:

 

import java.io.Serializable;

public class Person implements Serializable {
	private static final long serialVersionUID = -3432072860096318326L;
	private String name;
	private String password;

	public Person(String name, String password) {
		this.name = name;
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

 

 测试代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;


public class TestClone {

	/**
	 * @param args
	 */
	 public static Object objectClone(Object originObj) {
		  PipedOutputStream op = new PipedOutputStream();
		  PipedInputStream ip = new PipedInputStream();
		  ObjectOutputStream oos = null;
		  ObjectInputStream ois = null;
		  try {
		   op.connect(ip);
		   oos = new ObjectOutputStream(op);
		   oos.writeObject(originObj);
		   ois = new ObjectInputStream(ip);
		   Object obj = ois.readObject();
		   return obj;
		  } catch (Exception e) {
			  System.out.println("exception");
			  return null;
		  } finally {
		   try {
		    op.close();
		    ip.close();
		    op = null;
		    ip = null;
		    if (oos != null) {
		     oos.close();
		     oos = null;
		    }
		    if (ois != null) {
		     ois.close();
		     ois = null;
		    }
		   } catch (IOException e) {
		   }
		  }
		 }
	public static void main(String[] args) {
		Person p1 = new Person("jianchen","123456");
		System.out.println(p1);
		Person p2 = (Person)objectClone(p1);
		System.out.println(p2);
		System.out.println(p2.getName()+"  "+p2.getPassword());

	}

}

 输出如下:

Person@61de33
Person@60aeb0
jianchen  123456

分享到:
评论
2 楼 junJZ_2008 2010-05-06  
可以直接使用ByteArrayInputStream与ByteArrayOutputStream流啊,不需要使用管道的

另外深层克隆使用clone比序列化要快,具体可以参考:http://www.iteye.com/topic/659877#1484197
1 楼 mshijie 2009-04-13  
好方法,学习了。

相关推荐

    java深度克隆

    3. **安全性问题**:使用序列化实现深度克隆可能会存在安全风险,例如反序列化恶意构造的数据可能导致代码执行等安全漏洞。 4. **实现限制**:只有实现了`Serializable`接口的类才能被正确地序列化和反序列化。 ###...

    clone 深度克隆对象

    特别是在多线程环境下,深度克隆可以避免因共享对象导致的并发问题。 总结一下,深度克隆是复制复杂对象时确保数据独立性和安全性的有效手段。虽然它的效率可能不如直接new一个新的对象,但在需要保护原始数据不被...

    java的深度克隆的例子

    在Java编程语言中,"深度克隆"是一个重要的概念,主要涉及到对象复制。深度克隆,也称为完全克隆,是指创建一个与原...理解并正确使用深度克隆在处理复杂的对象结构时尤其重要,可以避免因对象共享导致的意外修改问题。

    深入JAVA对象深度克隆的详解

    总之,Java对象的深度克隆是解决复杂对象复制问题的有效手段,通过序列化和反序列化确保了新旧对象的完全独立。然而,它也有其局限性和潜在性能影响,所以在实际应用中应根据具体情况选择合适的克隆策略。

    JS对象深度克隆实例分析

    需要注意的是,深度克隆并不是JavaScript的标准功能,而是通过各种技术手段实现的,因此在处理复杂数据结构时可能会遇到问题,如循环引用、函数、日期、正则表达式等非标准JSON格式的对象。此外,性能也是一个考虑...

    js深度克隆(解决引用问题).txt

    本文档是解决 引用问题的解决方案,它不仅可以解决引用值拷贝 ,还可以原样复制一个一摸一样的数组、对象包括其中的方法。

    nanoclone只有145B实现深度克隆JavaScript对象

    标题提到的"nanoclone"是一个极简的JavaScript库,其核心代码只有145字节,但能实现深度克隆功能。这在追求轻量级解决方案的场景下显得尤为宝贵。 在JavaScript中,有多种实现深拷贝的方法。例如,可以使用JSON的...

    浅析Java中clone()方法浅克隆与深度克隆

    为了克服浅克隆的问题,需要实现深度克隆。深度克隆不仅复制对象的基本类型成员,还递归地复制所有引用类型的成员,确保新对象和原对象不共享任何引用。在Employee类中,可以通过重写clone()方法,对hireDay域进行...

    打篮球与设计模式(关于设计模式)

    - 克隆方法的实现可能会导致对象的深度克隆问题。 #### 结构型模式 ##### 6. **适配器模式 (Adapter)** 适配器模式是一种常用的设计模式,它可以让那些因为接口不兼容而不能一起工作的类能够协同工作。文中提到姚...

    基于深度学习的代码克隆检测技术研究.pdf

    这种现象可能是由于开发人员在面对类似问题时,采取了复制粘贴的方式,导致相同或相似的代码片段散落在一个或多个程序中,这被称为代码克隆。代码克隆不仅增加了代码冗余,而且也可能给软件的维护、升级和质量保证...

    DOM节点深度克隆函数cloneNode()用法实例

    在JavaScript中,DOM(Document...然而,需要注意的是,深度克隆也会复制节点上的所有属性和事件监听器,可能会导致性能问题,特别是在处理大量或复杂的DOM结构时。因此,在使用时应根据具体需求权衡是否需要深度克隆。

    js代码-javascript深度克隆

    JavaScript深度克隆是一种在编程中复制对象或数组的方式,它不仅复制了对象的表面属性,还复制了嵌套的对象和数组。在JavaScript中,浅拷贝(shallow copy)只复制对象的引用,而深度克隆(deep clone)会创建一个...

    ruby-deepclone:本机Ruby深度克隆实现

    地位系统地位特拉维斯 宝石版 代码Climante描述该gem提供了本机实现,可以深度克隆Ruby对象。 它支持Ruby 1.9.3、2.2.x,2.3.x和2.4.x。安装 gem install ruby_deep_clone或将其添加到您的Gemfile gem 'ruby_deep_...

    javascript克隆对象深度介绍

    在进行对象克隆的过程中,根据复制的深度,可以分为浅度克隆和深度克隆。 浅度克隆(Shallow Clone)仅适用于对象的第一层属性,如果属性值为基本类型,则复制其值;如果属性值为引用类型,则复制其引用地址。这...

    C#深度拷贝克隆源码

    这种方法可以实现深度拷贝,但可能不适合所有情况,因为它可能带来性能问题,且要求类实现`ISerializable`接口或添加序列化特性。 ```csharp using System.IO; using System.Runtime.Serialization.Formatters....

    网络克隆。

    PXE(Preboot Execution Environment)网络克隆则解决了这个问题,它无需DOS环境,也不需要目标硬盘预先有数据。 PXE是基于DHCP和TFTP协议的远程启动技术。当一台计算机启用PXE时,其网卡上的BOOT ROM会发送一个...

Global site tag (gtag.js) - Google Analytics