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

利用串行化做深克隆

阅读更多

克隆或者复制有两种方式。这两种方式分别是浅克隆(浅复制)和深克隆(深复制)。

 

浅克隆(浅复制)

   被克隆对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然值向原来的对象。换言之,浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象。

 

 

深克隆(深复制)

   被克隆对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。这些引用其他对象的变量将指向被克隆过的新对象,而不再是原有的那些被引用的对象。换言之,深克隆把要克隆的对象所引用的对象都克隆一遍,而这种对被引用到的对象的克隆叫做间接克隆。

   深克隆要深到多少层,是一个不易确定的问题。因此,在采取深克隆时,需要决定多深才算深。此外,在深克隆的过程中,很可能会出现循环引用的问题,必须小心处理

 

利用串行化做深克隆

 

    在Java里深克隆一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写道一个流里,再从流里读回来,便可以重建对象。

 

 

 

 

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

public class deep implements Serializable {


	private static final long serialVersionUID = 9031569199021177136L;
	private String name;
	private Long age;

	public Long getAge() {
		return age;
	}

	public void setAge(Long age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public Object deepClone() throws ClassNotFoundException, IOException{
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(this);
		ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
		ObjectInputStream oi = new ObjectInputStream(bi);
		return (oi.readObject());
	}
}
 
4
0
分享到:
评论
3 楼 yz_beijing 2009-11-09  
不知道这种克隆方式的效率怎么样?
2 楼 mtou 2008-06-11  
colne只能实现浅克隆,要深克隆必须自己手写代码实现
1 楼 java心如止水 2008-06-11  
colne不是实现colneable接口吗?

相关推荐

    java对象的串行化

    【Java对象的串行化】是指将Java对象的状态转换为字节序列的过程,这使得对象可以在需要时重新创建,从而实现对象的持久化。对象串行化是Java平台的一个核心特性,它允许对象的状态被保存并能够在不同的时间点或者在...

    MFC 文档串行化

    在Microsoft Foundation Classes (MFC)库中,文档串行化是一种关键机制,它允许应用程序将文档数据保存到磁盘,并从磁盘加载回内存。这个过程对于实现文件的持久化和用户界面的状态恢复至关重要。MFC的设计遵循了...

    串行化和图像读取显示

    在VC++(Visual C++)环境下,我们可以利用诸如`serialize`函数或第三方库如Boost.Serialization来实现串行化。这在数据持久化、网络通信以及跨进程通信中都具有广泛的应用。 接下来,我们讨论“图像显示”。在VC++...

    对象序列化 串行化

    对象序列化 串行化 实现java对象的保存

    mfc 串行化的简单使用

    ### MFC串行化的基本应用 #### 一、串行化概述 串行化(Serialization)是计算机科学中的一个重要概念,特别是在数据存储和传输领域。简单来说,串行化就是将对象的状态信息转换为可以存储或传输的形式的过程;而...

    MFC的文件串行化操作

    本文将深入探讨MFC中的文件串行化操作,并介绍如何利用它来保存和加载图形的特性。 首先,让我们理解什么是串行化。串行化是将对象的状态转换为字节流的过程,这些字节流可以存储在磁盘文件中或在网络上传输。相反...

    基于对话框工程的串行化-可用于保存配置

    这样做的原因是,CSerializable接口提供了串行化操作的钩子函数,如Serialize()。 1. **定义串行化类**:创建一个新的类,例如CConfig,继承自CObject。在这个类中,你需要声明需要串行化的成员变量,并重写 ...

    tsdf.zip_tsdf_串行化

    串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好...本文试图对串行化做一个简单的解释。由于本人对串行化功能使用的也不多,不足之处敬请谅解。

    收集几个 MFC串行化数据和C++对象的 实例

    要使一个类可以被串行化,你需要做两件事:声明`DECLARE_SERIAL`宏并在类定义中包含,然后在类的实现文件中实现`IMPLEMENT_SERIAL`宏。 2. **DECLARE_SERIAL与IMPLEMENT_SERIAL宏** - `DECLARE_SERIAL(Class)`宏在...

    C# 对象串行化输入输出 演示代码

    在C#编程中,对象串行化是一种将对象的状态转换为可以存储或传输的数据格式的过程。这通常涉及将对象的数据转换成字节流,以便在内存、文件或网络中保存和恢复。对象串行化是软件开发中的一个重要概念,尤其在持久化...

    并行程序串行化执行

    CGLIB的优点在于它能够透明地处理目标类,不需要对原始代码做任何修改,这使得串行化执行的实现更加灵活和易于维护。 需要注意的是,虽然CGLIB能实现并行到串行的转换,但这种转换可能会影响程序的性能,因为原本...

    Visual Basic.NET 串行化参考手册

    《Visual Basic.NET 串行化参考手册》是针对使用Visual Basic.NET进行对象串行化的重要资源,它提供了全面且深入的指导...通过深入学习和实践,开发者能够充分利用串行化来优化程序设计,提高应用的可扩展性和复用性。

    C#344-对象串行化源代码

    对象串行化是编程中一个重要的概念,尤其是在.NET框架中,C#提供了强大的支持。对象串行化是指将对象的状态转换为可以存储或传输的数据格式的过程,如XML、JSON或二进制。这个过程允许我们将对象的信息保存到磁盘、...

    C#图形对象的串行化实例

    在编程领域,串行化是一种将复杂的数据结构转化为可以存储或传输的格式的过程。在C#中,串行化主要用于保存对象的状态以便后续恢复,或者是跨进程或网络传输数据。本实例聚焦于C#图形对象的串行化,这是一个实用的...

    串行化保存和读取数据示例.zip

    在编程领域,串行化(Serialization)是一种将对象的状态转换为可以存储或传输的数据格式的过程。这个过程使得数据能够在不同的...通过上述知识点的学习和实践,你将能够更好地利用Java的串行化特性来解决实际问题。

    MFC串行化数据测试例程

    在这个“MFC串行化数据测试例程”中,我们将深入探讨MFC库中的串行化机制,以及如何利用`CArchive`类来实现数据的持久化存储。 串行化是将对象的状态转换为可存储或可传输的形式的过程,而反串行化则是相反的过程,...

    VC .net 串行化数据实例.rar

    总之,这个“VC .net 串行化数据实例”压缩包提供了一个很好的学习平台,让你深入理解.NET中的数据串行化,并掌握如何在C++ .NET项目中有效利用这项技术。无论是为了持久化对象、交换数据还是其他目的,掌握串行化都...

    【IT十八掌徐培成】Java基础第16天-03.串行化-深度复制.zip

    深复制通常需要自定义实现,或者利用序列化和反序列化的方法来完成。例如: ```java public MySerializableClass deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream ...

    实例解析C++/CLI的串行化

    在编程语言中,串行化是一个非常重要的概念,它涉及到数据的持久化存储和网络传输。串行化(Serialization)是指将对象的状态信息转换为可以存储或传输的形式的过程,这个过程通常会把对象转换成字节流,便于数据的...

Global site tag (gtag.js) - Google Analytics