`
dacoolbaby
  • 浏览: 1254372 次
  • 性别: 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序列化Serializable及Externalizable区别详解

    主要介绍了JAVA序列化Serializable及Externalizable区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    比较常见的做法有两种: 一是把对象包装成JSON字符串传输, 二是采用Java对象的序列化和反序列化。 随着Google工具protoBuf的开源,protobuf也是个不错的选择。 *提示:对JSON,Object Serialize,ProtoBuf 做个对比。...

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

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

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

    NULL 博文链接:https://zhycaf.iteye.com/blog/982092

    java序列化和反序列化,面试必备

    最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...

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

    Serializable接口和Externalizable接口实现序列化和反序列化

    深入探索Java对象的序列化

    Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...

    xml的序列化与验证

    1、xml序列化的Java3种实现方法 1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator ...

    JDK_API_1_6

    Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 FileFilter 用于抽象路径名的过滤器。 FilenameFilter 实现此接口的类实例可用于过滤器文件名。 ...

    groovy-io:与JSON格式之间完美的Groovy序列化。 此外,还支持JSON的精美打印(与jsonEditorOnline样式匹配)

    往返于JSON格式的完美序列化(可在)。 要包含在您的项目中: &lt;groupId&gt;com.cedarsoftware&lt;/groupId&gt; &lt;artifactId&gt;groovy-io &lt;version&gt;1.1.3 groovy-io由两个主要类组成,一个读者( GroovyJsonReader )和...

    VALJOGen:VALue Java 对象生成器 (VALJOGen)

    支持Serializable和Externalizable接口的自动实现。 极其可定制的代码输出。 您可以更改生成的类的每个方面,甚至可以使用基于的自定义模板添加您自己的代码。 对不可变值对象的强大支持,包括最终字段和不可变...

    dom4J的使用方法ppt.

    dom4J的使用方法ppt.

    LargeCollections

    虽然 LargeCollections 支持任何 Serializable/Externalizable/Writable/Kryo-Serializable Key 和 Value 类,但底层实现将所有内容存储为字节数组键值存储(类似于 HBase)。 因此,每个键/值实例都需要转换为

    j2ee中英文对照版api

    用请求处理的动词和描述将要操作的数据的 DataHandler 来初始化 Command。注:调用者为 DataHandler 传递 null 值是可以接受的。 verb 此对象引用的 Command Verb。 dh DataHandler。 英文文档: ...

    cocoaAMF使用指南.zip

    AMF是Action Message Format协议的简称,AMF协议是Adobe公司自己的协议,主要用于数据交互和远程过程调用,在功能上相当于WebService,但是AMF与WebService中的XML不同的是AMF是二进制数据,而XML是文本数据,AMF的...

Global site tag (gtag.js) - Google Analytics