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

Java序列化 Seriallizable 和 Externalizable

    博客分类:
  • Java
阅读更多

1.Java对象序列化是将 对象的实例域数据( 包括private私有域) 进行持久化存储。而并非是将整个对象所属的类信息进行存储。

2.我们都知道凡要序列化的类都必须实现Serializable接口。包括Externalizable接口

3.包含了不可序列化的对象域的对象也是不能序列化的。 

 

实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式 

 

对象序列化包括如下步骤:

  1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

  2) 通过对象输出流的writeObject()方法写对象。

 

对象反序列化的步骤如下: 

  1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流; 

  2) 通过对象输入流的readObject()方法读取对象。

 

相比Serializable接口,Externalizable接口更加能够控制序列化过程中的细节。

而本人实际测试中,Externalizable接口进行序列化,会比Serializable接口,速度要快20%-40%

 

写一个Externalize序列化的Example:

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Customer implements Externalizable {
	private String name;
	private int age;
	
	public Customer(){
		//必须创建一个无参的构造函数,因为Externalizable在创建对象的时候,会调用构造函数。
		//否则会报错java.io.InvalidClassException  no valid constructor
	}
	
	public Customer(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String toString() {
		return "name=" + name + ", age=" + age;
	}

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

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

	public String getName() {
		return this.name;
	}

	public int getAge() {
		return this.age;
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		String name = in.readUTF();
		int age = in.readInt();
		this.setName(name);
		this.setAge(age);
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		out.writeUTF(this.name);
		out.writeInt(this.age);
	}
}

 

调用端测试:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectSerializeTest {
	
	public void saveCustomer() throws FileNotFoundException,
			IOException {
		
		File file = new File("D:/objectFile.obj");
		if(file.exists())
			file.delete();
		
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
				"D:/objectFile.obj"));

		// 序列化对象
		Customer2 c = new Customer2("阿蜜果", 24);
		out.writeObject(c);
		out.close();
	}

	public Customer2 getCustomer() throws FileNotFoundException, IOException,
			ClassNotFoundException {
		// 反序列化对象

		ObjectInputStream in = new ObjectInputStream(new FileInputStream(
				"D:/objectFile.obj"));

		Customer2 customer = (Customer2) in.readObject();
		in.close();
		return customer;

	}

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		int counter = 10000;
		ObjectSerializeTest test = new ObjectSerializeTest();
		test.saveCustomer();
		
		long startTime=System.currentTimeMillis();   //获取开始时间
		for(int i=0;i<counter;i++)
			test.getCustomer();
		long endTime=System.currentTimeMillis(); //获取结束时间
		
		System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
		
	}

}

 

 refer to:http://hxraid.iteye.com/blog/461935

分享到:
评论

相关推荐

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

    * 使用 Externalizable 接口实现序列化和反序列化 * 使用 Java 序列化 API 实现序列化和反序列化 在实际开发中,选择合适的序列化和反序列化方法取决于具体的需求和场景。在本例中,我们使用 Serializable 接口实现...

    Java 串行化(序列化)Serializable/Externalizable

    Java 串行化是Java平台中的一个重要特性,它允许...综上所述,Java的序列化和外部化是实现对象持久化和跨进程通信的关键技术。理解并熟练掌握这些概念,能够帮助开发者更好地处理与对象状态保存和恢复相关的各种问题。

    Java对象序列化标准最新版

    这样可以确保即使对象的结构发生了变化,仍然能够正确地进行序列化和反序列化。 **5.2 目标** 版本管理的目标是在对象结构发生变更时保持序列化的兼容性。这有助于减少因对象变更而导致的问题。 **5.3 假设** ...

    java对象序列化.ppt

    而`Externalizable`接口提供了更多的控制权,允许开发者自定义序列化和反序列化的过程。 实现`Serializable`接口的示例如下: ```java public class Person implements Serializable { private String name; ...

    java序列化与反序列化

    Java序列化和反序列化是Java平台中的核心特性,允许对象在各种上下文中持久化和传输。虽然它提供了许多便利,但同时也需要注意安全性问题和性能优化。在实际开发中,根据需求选择合适的序列化策略和工具是至关重要的...

    Java实现序列化例子

    在这种情况下,可以考虑使用`writeObject()`和`readObject()`方法来自定义序列化行为,或者使用`Externalizable`接口,它比`Serializable`提供了更多的控制。 6. **序列化框架**:除了Java内置的序列化机制,还有...

    探索Java序列化与反序列化的奥秘:数据持久化的桥梁

    2. **实现Externalizable接口**:如果需要更多控制权,可以选择实现`Externalizable`接口,该接口要求实现`writeExternal()`和`readExternal()`方法,从而可以自定义序列化和反序列化的逻辑。 #### 示例代码:序列...

    java序列化和反序列化1

    Java的序列化和反序列化是Java开发中重要的概念,主要涉及对象状态的持久化以及在网络传输中的数据转换。在Java中,序列化是将一个对象转换为字节序列的过程,而反序列化则是将字节序列恢复为原始对象的过程。 1. *...

    Java 文件 序列化 读写

    - 通过实现`writeObject()`和`readObject()`方法,可以自定义序列化和反序列化的行为,例如处理复杂的对象结构或敏感数据。 8. **序列化安全**: - 序列化可能引发安全问题,如序列化漏洞。因此,应当谨慎处理反...

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

    `java.io.ObjectOutputStream`和`java.io.ObjectInputStream`是Java标准库中用于序列化和反序列化的类。前者通过`writeObject()`方法将对象写入输出流,后者通过`readObject()`方法从输入流中读取对象。 需要注意的...

    java序列化方式Java系列2021.pdf

    **实现Externalizable接口**:这种方式比隐式序列化更灵活,因为它需要我们手动实现`writeExternal()`和`readExternal()`方法来控制哪些数据需要序列化和反序列化。这样,我们可以精细地控制序列化的过程,比如选择...

    Java中的序列化与反序列化.pdf

    另外,Java还提供了一个更灵活的序列化接口`Externalizable`,它要求类自己控制序列化和反序列化的过程,需要实现`writeExternal()`和`readExternal()`方法。这种方式更耗费资源,但能更好地控制序列化过程,特别是...

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但提供了更细粒度的控制权,允许类自定义序列化和反序列化的行为。如果一个类实现了`Externalizable`,则需要手动实现`writeExternal...

    java序列化对象的存储和读取共6页.pdf.zip

    - `Externalizable`接口提供了一种自定义序列化和反序列化方式,但需要手动编写序列化逻辑。 8. **`ObjectInputStream`和`ObjectOutputStream`的其他方法:** - `defaultWriteObject()`用于写入默认的流式序列化...

    java序列化深度探讨

    实现`Externalizable`接口的类可以完全控制序列化和反序列化的过程,而不是依赖于默认的序列化机制。通过重写`writeExternal`和`readExternal`方法,程序员可以自定义对象状态的存储和恢复方式,这通常用于优化性能...

    Java 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    深入剖析Java序列化:挑战复杂的面试题与详细解析

    - 实现`Serializable`接口,并可选择重写`writeObject()`和`readObject()`方法来自定义序列化和反序列化逻辑。 5. **处理循环引用**: - 使用`transient`关键字标记循环引用的成员变量,或者通过重写序列化方法来...

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

    3. **意义**:如果两个类的`serialVersionUID`相同,则认为这两个类是同一版本,可以互相序列化和反序列化。 #### 序列化过程详解 1. **序列化**:通过`java.io.ObjectOutputStream`类的`writeObject()`方法将对象...

Global site tag (gtag.js) - Google Analytics