`
这些年
  • 浏览: 402265 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对象的深度复制

    博客分类:
  • java
 
阅读更多

1:使用序列化

      1)被序列化的对象实现Serializable接口(arraylist实现了这个接口)

       

package com.chinachche.datacorrection.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class DataUtil {
	/**
	 * 深度复制
	 */
	public static Serializable deeplyCopy(Serializable src) {
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(src);
			oos.close();
			baos.close();

			byte[] data = baos.toByteArray();
			ByteArrayInputStream bais = new ByteArrayInputStream(data);
			ObjectInputStream ois = new ObjectInputStream(bais);
			Serializable copy = (Serializable) ois.readObject();
			ois.close();
			bais.close();
			return copy;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

 

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF

http://tristan1.iteye.com/blog/752895

http://blog.csdn.net/wangwenjunsw/article/details/5550441

 

2:克隆(复杂问题解决困难)

       1). 在类的声明中加入“ implements Cloneable ”,标志该类有克隆功能;
       2). 重载类 Object 的 clone() 方法,在该方法中调用 super.clone() :

       3)类中包含其它对象的,其它对象的类也须要声明为Cloneable

 

package com.chinachche.datacorrection.util;

public class cloneBeanA implements Cloneable {//实现接口
	private String userName;
	private Friend friend;       //对象类型变量

	public Object clone() {
		try {
			cloneBeanA b = (cloneBeanA) super.clone();
			b.friend = (Friend) friend.clone();//克隆对象类型数据
			return b;
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public Friend getFriend() {
		return friend;
	}

	public void setFriend(Friend friend) {
		this.friend = friend;
	}
}

 

package com.chinachche.datacorrection.util;

public class Friend implements Cloneable {//实现接口
	private String friendName;

	public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String getFriendName() {
		return friendName;
	}

	public void setFriendName(String friendName) {
		this.friendName = friendName;
	}
}

 

 测试代码:

package com.chinachche.datacorrection.util;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class testClone {
	Friend f1 = new Friend();

	@Before
	public void Init() {
		f1.setFriendName("zhang san");
	}

	@Test
	public void testClones() {
		cloneBeanA a = new cloneBeanA();
		a.setUserName("gbz");
		a.setFriend(f1);

		cloneBeanA b = (cloneBeanA) a.clone();
		b.setUserName("123");
		f1.setFriendName("456");

		assertEquals("456", a.getFriend().getFriendName());
		assertEquals("zhang san", b.getFriend().getFriendName());
	}
}

 关于克隆的详解:http://www.iteye.com/topic/428920

分享到:
评论

相关推荐

    deeplyAssign将所有可枚举的属性和符号属性的值从一个或多个源对象深度复制到目标对象

    它能够递归地复制一个或多个源对象的所有可枚举属性和符号属性到目标对象,确保原始对象与拷贝后的对象互不干扰。在TypeScript这种强类型语言中,这样的功能尤为重要,因为它可以提供更好的类型安全性和代码可维护性...

    C# 使用反射来实现对象的深度复制方法

    以下是一个使用反射实现对象深度复制的示例代码: ```csharp public static class DeepCopyHelper { public static object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType...

    java List 深度复制方法

    这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来理解一下什么是浅复制和深复制。在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象...

    c#深度复制浅度复制

    在C#编程中,"深度复制"和"浅度复制"是对象复制过程中两个重要的概念,它们涉及到如何正确地复制复杂的数据结构。了解并熟练掌握这两种复制方式对于编写高效、可靠的代码至关重要。 首先,让我们来定义这两个术语:...

    java 深度拷贝 复制 深度复制.zip

    在Java编程中,深度拷贝和浅拷贝是两种重要的对象复制方式,它们涉及到对象的内存管理和内存结构的复制。本篇文章将详细讲解如何利用Java的反射机制实现深度拷贝,以及这种方式的优点和注意事项。 首先,理解深度...

    java不同对象及集合的多次复制

    - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,可以实现不同对象间的复制。 - **ModelMapper库**:提供了`ModelMapper`类,可以通过配置注解自动映射对象,简化了复制过程。 4. **集合与...

    java深度复制源代码

    ### Java深度复制源代码知识点解析 ...综上所述,该Java深度复制工具类通过反射机制实现了JavaBean对象的深度复制,适用于多种场景下的对象复制需求,但在实际应用中需要注意性能和特殊对象结构的处理问题。

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    这篇博文“MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...

    如何由浅复制到深度复制

    我想实现了深度复制呢,也就是我新复制出来的对象不是仅仅复制引用, 而是复制对象!比如说,你需要在一个模板的基础上修改出5个版本的建立,每个版本投递到不同的企业上,版本1投给公司A,版本2投给公司B,。。。...

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等)...1、对于引用类型的List无法用以上方法进行复制,只会复制List中对象的引用,可以用以下扩展方法复制: static class Extensions { public static IList<T> Clone(t

    深度探索c++对象模型(2012版本)

    此外,拷贝构造函数和赋值运算符也至关重要,它们处理对象的复制和赋值,确保数据的正确处理。 在C++中,类是定义对象的蓝图,而对象是类的实例。每个类可以有成员变量和成员函数,其中成员函数(方法)负责对象的...

    java对象复制克隆

    标签中的“复制java对象”、“深度克隆”和“深度复制实例”强调了我们要关注的是Java中如何实现对象的深拷贝,并提供了实际操作的例子。在编写代码时,应该遵循良好的编程实践,包括适当的命名、注释和错误处理,以...

    clone 深度克隆对象

    这意味着如果一个对象中包含了其他对象的引用,深度克隆会创建这些引用对象的独立副本,而不是简单地复制引用。因此,即使原始对象被修改,深克隆后的副本也不会受到影响,从而提供了数据安全性。 在Java中,实现...

    List Clone.zip_c list深度复制_list clone_list的深度复制 C#

    List的深度复制 浅谈C#中List<T>对象的深度拷贝问题

    C#中深度复制和浅度复制详解

    1. **深度复制(Deep Copy)**:深度复制会创建一个新的对象,这个新对象不仅包含原始对象的所有属性,而且如果原始对象的属性是引用类型,深度复制还会递归地复制这些引用对象,确保新对象和原始对象之间没有任何...

    C#对象映射操作源代码

    利用泛型缓存机制;支持对象、集合映射;支持对象深度复制;

    一个用于对象深度克隆的同构和可配置javascript函数

    标题提到的"一个用于对象深度克隆的同构和可配置javascript函数"是指一个能够在浏览器环境和Node.js环境中通用(同构)的JavaScript函数,它提供了一种灵活的方式来深度复制复杂的数据结构,同时允许用户根据需求...

    浅谈C#中List<T>对象的深度拷贝问题

    深度拷贝是指创建一个新对象,不仅复制原始对象的属性,还复制了嵌套对象的引用,确保新旧对象之间的独立性。本文将探讨C#中List对象的深度拷贝问题。 首先,我们来看当List中的T是值类型,如int、double等时的情况...

Global site tag (gtag.js) - Google Analytics