`

Serializable,利用序列化来做深度拷贝

    博客分类:
  • Java
JVM 
阅读更多
package Assis;

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

//利用序列化来做深复制   
//深clone   
public class DeepCloneTest {

	public static void main(String[] args) throws Exception {
		// teacher对象将不被clone出来的Student对象共享.
		Teacher teacher = new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher zhang");

		Student student1 = new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);

		// 复制出来一个对象student2
		Student student2 = (Student) student1.deepCopy();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());

		// 修改student2的引用对象
		student2.getTeacher().setAge(50);
		student2.getTeacher().setName("Teacher Li");

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}

class Teacher implements Serializable {

	private static final long serialVersionUID = -8834559347461591191L;

	public int age;
	public String name;

	public int getAge() {
		return age;
	}

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

	public String getName() {
		return name;
	}

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

}

class Student implements Serializable {

	// serialVersionUID
	// 如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。
	// 但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值
	private static final long serialVersionUID = 7991552226614088458L;

	public int age;
	public String name;
	public Teacher teacher;

	public int getAge() {
		return age;
	}

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

	public String getName() {
		return name;
	}

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

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

	public Object deepCopy() throws Exception {
		// 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
		ByteArrayOutputStream bos = new ByteArrayOutputStream();

		ObjectOutputStream oos = new ObjectOutputStream(bos);

		oos.writeObject(this);

		// 将流序列化成对象
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

		ObjectInputStream ois = new ObjectInputStream(bis);

		return ois.readObject();
	}

}
// 输出结果为:
// 20
// zhangsan
// ~~~~~~~~~~~~~~~~~~~~~~
// 40
// Teacher zhang
// ~~~~~~~~~~~~~~~~~~~~~~
// 40
// Teacher zhang

 

分享到:
评论
1 楼 hnzhoujunmei 2010-09-08  
为什么叫深度拷贝?拷贝的是对象的引用吗?直接用student2=student1不就行了嘛

相关推荐

    Java_Serializable(序列化)的理解和总结

    ### Java Serializable(序列化)的理解和总结 #### 一、序列化的定义与目的 序列化是一种将对象的状态转换为可以存储或传输的形式的过程。在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    java serializable 序列化与反序列化

    Java的序列化与反序列化是Java开发中的一项重要...在实际应用中,要根据具体需求来选择合适的序列化库,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro等,它们提供了更高效、更灵活的序列化解决方案。

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    序列化 serializable demo

    另外,序列化还涉及到版本控制问题,如果类的结构(如字段、方法等)发生变化,可以使用`serialVersionUID`来指定序列化版本。默认情况下,JVM会根据类的结构自动生成一个版本号,但如果手动定义`serialVersionUID`...

    Android序列化——Serializable与Parcelable

    本文将深入探讨两种主要的序列化方式:Serializable和Parcelable,并比较它们的优缺点以及适用场景。 首先,我们来了解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Android中,这个...

    Serializable序列化

    总结来说,`Serializable`序列化是Java中一个基础但至关重要的特性,它使得对象状态的保存和传输成为可能。理解并熟练掌握序列化,可以帮助开发者更好地应对各种存储和通信需求。在实际应用中,要注意安全性、性能和...

    java.io.Serializable序列化问题

    除了 `Serializable` 接口之外,Java 还提供了 `Externalizable` 接口来控制序列化过程。`Externalizable` 继承自 `Serializable`,并定义了两个方法: 1. `void writeExternal(ObjectOutput out)`:用来指定对象...

    可序列化接口Serializable

    序列化可以实现对象的深拷贝,即创建一个与原对象完全独立的新对象,修改拷贝不会影响原始对象。而浅拷贝仅复制对象引用,修改拷贝会影响原始对象。 **总结** `Serializable`接口在Java中扮演着至关重要的角色,它...

    析Android中的Serializable序列化.rar_Serializable _android

    当一个类实现Serializable接口后,Java运行时系统会自动调用`writeObject()`和`readObject()`方法来完成序列化和反序列化。默认情况下,这些方法会递归地序列化类的所有字段,包括私有和静态字段。但也可以自定义...

    javascript实现序列化serializable unserializable

    在JavaScript中,序列化(Serialization)和反序列化...开发者需要根据具体需求选择合适的方法和库来处理序列化和反序列化的问题。在实际开发中,理解这些概念及其应用能够帮助我们更好地管理和传递数据。

    序列化类的作用Serializable

    如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,但是父类的字段不会被序列化,除非父类中声明了`transient`或`volatile`的字段。 在序列化过程中,有时需要对特定类的字段进行特殊处理。...

    java序列化和反序列化的方法

    在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...

    java反序列化利用程序UI版Beta1.1.rar

    1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...

    java 对象的序列化与反序列化

    5. **深拷贝与浅拷贝**:序列化实际上是实现了深拷贝,即创建了对象的一个完全独立的副本,修改副本不会影响原对象。 6. **安全性问题**:序列化可能导致安全漏洞,因为恶意用户可以通过反序列化执行任意代码。因此...

    用序列化(Serializable)保存、读取对象

    在Java编程语言中,序列化(Serializable)是一个关键特性,它允许对象的状态被持久化到磁盘上,或者在网络中进行传输。...通过理解和掌握序列化机制,开发者可以有效地利用这一特性来实现对象的持久化和网络通信。

    Serializable在C#中的作用.NET 中的对象序列化

    ### C#中Serializable的作用与对象序列化详解 #### 一、引言 在现代软件开发中,特别是基于.NET框架的应用程序开发中,对象序列化是一项非常重要的技术。它允许将对象的状态转换为一种持久的形式(如文件或网络传输...

    C#和Java的序列化反序列化

    而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...

    Java序列化(Serializable)与反序列化__1.docx

    1. Object Serialize:Java内置的序列化机制,通过实现`Serializable`接口来实现对象的序列化。在进行反序列化时,Java会验证`serialVersionUID`,确保对象在序列化和反序列化之间的一致性。 2. JSON:通过将对象...

Global site tag (gtag.js) - Google Analytics