`
jaesonchen
  • 浏览: 313405 次
  • 来自: ...
社区版块
存档分类
最新评论

java对象复制之Serializable

 
阅读更多
import java.io.*;

@SuppressWarnings("all")
public class CloneBySerializable implements Serializable {
	private int j;
	private Thing thing;
	public CloneBySerializable(int j) {
		this.j = j;
		this.thing = new Thing(j);
	}
	public static void main(String[] args) {
		CloneBySerializable[] arr = new CloneBySerializable[10000];
		for (int i = 0, length = arr.length; i < length; i++) {
			arr[i] = new CloneBySerializable(i);
		}
		
		try {
			
			long t1 = System.currentTimeMillis();
			ByteArrayOutputStream buf =
					new ByteArrayOutputStream();
			ObjectOutputStream o =
					new ObjectOutputStream(buf);
			for(int i = 0; i < arr.length; i++)
				o.writeObject(arr[i]);
			
			ObjectInputStream in =
					new ObjectInputStream(
							new ByteArrayInputStream(
									buf.toByteArray()));
			CloneBySerializable[] copy = new CloneBySerializable[arr.length];
			for(int i = 0; i < copy.length; i++)
				copy[i] = (CloneBySerializable) in.readObject();
			long t2 = System.currentTimeMillis();
			System.out.println("Duplication via serialization: " +
					(t2 - t1) + " Milliseconds");
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		//单例类防止复制
		Dog newDog = (Dog) deepCopy(Dog.INSTANCE);
		System.out.println(newDog == Dog.INSTANCE);	//true
  		
	}
	static class Dog extends Exception {
  		public static final Dog INSTANCE = new Dog();
  		private Dog() {}
  		public String toString(){
   			return "Woof";
  		}
  		//用于解决返回新实例的问题
  		private Object readResolve(){
   			return INSTANCE;
  		}
 	}
 	static public Object deepCopy(Object obj){
  		try{
   			ByteArrayOutputStream bos =
    				new ByteArrayOutputStream();
   			new ObjectOutputStream(bos).writeObject(obj);
   			ByteArrayInputStream bin =
    				new ByteArrayInputStream(bos.toByteArray());
   			return new ObjectInputStream(bin).readObject();
  		} catch(Exception e) {
   			throw new IllegalArgumentException(e);
  		}
 	}
}
@SuppressWarnings("all")
class Thing implements Serializable {
	private int i;
	public Thing(int i) {
		this.i = i;
	}
}


 

   java序列化实现的对象复制性能比clone差

 

   一个实现了Serializable 的单例类,必须有一个readResolve 方法,用以返回它的唯一的实例。
   对一个实现了Serializable 的类进行了扩展,或者实现了一个扩展自Serializable 的接口,
   使得我们在无意中实现了Serializable。

分享到:
评论

相关推荐

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

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

    在MyBatis中,我们通常会定义Mapper接口和XML配置文件,映射SQL语句与Java对象之间的关系。如果需要在数据库操作后复制对象,可以在Mapper接口的方法中,或者在Service层中实现对象复制。 总的来说,Java中的对象...

    java 对象克隆

    总结,Java中的对象克隆是一项重要的功能,用于复制和独立化对象。通过实现`Cloneable`接口和覆盖`clone()`方法,我们可以创建浅克隆对象。对于更复杂的场景,可以自定义克隆逻辑或利用序列化来实现深克隆。理解并...

    java 对象默认序列化的干预方法

    Java对象的序列化是将一个对象的状态转换成字节流的过程,以便于存储、网络传输或复制。在Java中,实现`Serializable`接口的类可以被序列化。然而,有时我们可能希望在序列化过程中忽略某些敏感或临时的成员变量。这...

    关于Java对象序列化您不知道的5件事Java开发Java

    为了使一个Java对象能够被序列化,该类必须实现`java.io.Serializable`接口。虽然这个接口没有任何方法,但它的存在告诉JVM这个类的实例可以被转换为字节流。如果一个类没有实现这个接口,尝试序列化其对象时会抛出...

    Java对象序列化详细解析.doc

    Java对象序列化是一种将Java对象转换为字节流的过程,以便于存储、传输或在网络间进行通信。这一过程使得对象的状态能够被持久化,即使在程序关闭后也能重新恢复。在Java中,对象序列化是通过实现`java.io....

    java 深克隆浅克隆

    克隆技术在处理复杂数据结构、避免对象共享以及实现对象复制等方面有着广泛的应用。Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,...

    Java对象深复制与浅复制实例详解

    Java对象深复制与浅复制是Java编程中两个重要的概念,它们都是对象复制的方式,但它们有着不同的实现机制和应用场景。在本文中,我们将详细介绍Java对象深复制与浅复制的概念、实现机制、应用场景和示例代码。 浅...

    Java深复制与浅复制&Clone

    在Java编程语言中,对象复制是一个常见的操作,用于创建一个现有对象的新副本。有两种主要的复制方式:浅复制(Shallow Copy)和深复制(Deep Copy)。这两种复制方法在处理对象时有不同的行为和应用场景,特别是在...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    在Android中,我们常常需要复制Parcelable或Serializable类型的对象,因为它们是Android系统支持的数据传输和序列化方式。对于Parcelable,我们可以使用`Parcel`类的`writeParcelable`和`readParcelable`方法进行...

    java对象序列化 传输 保存

    Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储这些对象或通过网络进行传输。这个过程是Java平台的核心特性,它允许开发者将复杂的对象结构持久化或者在网络间进行安全通信。序列化不仅可以用于...

    java中对象的序列化

    要实现Java对象的序列化,类必须实现`java.io.Serializable`接口。虽然这个接口不包含任何需要实现的方法,但它的存在表明该类的实例是可序列化的。 序列化的主要步骤包括: 1. **实现Serializable接口**:首先,你...

    Java对象序列化详细解析[参考].pdf

    当一个Java对象需要被序列化时,开发者需要确保该对象的类实现了`Serializable`接口。这是因为Java的序列化机制依赖于这个接口来识别哪些对象可以被序列化。 在描述中提到,`JSP`规范并没有强制要求`BEAN`实现`...

    可序列化接口Serializable

    在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是实现对象持久化的关键。本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含...

    java串行化详细的介绍了java串行化的概念

    Java序列化是指将一个Java对象的状态转换为字节流,以便于存储或通过网络进行传输的过程。当接收端接收到这些字节流后,可以将其重新转换为原始的对象状态。这个过程对于分布式系统的数据交换非常重要。 #### 二、...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    在Java编程语言中,克隆是一种创建对象副本的技术,它允许我们复制一个对象的状态而不影响原始对象。...在设计类和系统时,应考虑对象复制的需求,并决定是否实现`Cloneable`接口,以及选择哪种克隆策略。

    Java-Java面向对象中引用传递教程

    在Java编程语言中,面向对象特性是其核心概念之一,其中引用来传递对象是一个非常重要的知识点。本教程将深入探讨Java中的引用传递机制,并通过视频教程的形式帮助学习者更好地理解和应用这一概念。 首先,理解...

    java对象拷贝常见面试题及应答汇总

    Java对象拷贝常见面试题及应答汇总 在Java编程中,对象拷贝是一种常见的操作, 涉及到对象的复制和克隆。下面总结了一些常见的面试题和应答,供大家学习和参考。 为什么要使用克隆? 在某些情况下,我们需要对一...

    24、序列化 Serializable1

    - **序列化**: 将一个Java对象转换为字节流的过程。这个过程使得对象可以在不考虑其创建环境的情况下,在不同的时间、地点被重建。 - **反序列化**: 将字节流还原为原来的Java对象的过程。这个过程确保对象的所有...

    java的深度克隆的例子

    在Java编程语言中,"深度克隆"是一个重要的概念,主要涉及到对象复制。深度克隆,也称为完全克隆,是指创建一个与原对象相同的新对象,不仅复制原对象的所有属性,还复制了原对象中引用的对象。这通常用于创建一个...

Global site tag (gtag.js) - Google Analytics