文档章节

Java序列化 Seriallizable 和 Externalizable

吐槽的达达仔
 吐槽的达达仔
发布于 2014/12/05 22:18
字数 607
阅读 21
收藏 0

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

本文转载自:http://dacoolbaby.iteye.com/blog/2108773

吐槽的达达仔
粉丝 27
博文 103
码字总数 6775
作品 0
广州
程序员
私信 提问
小伙子,你真的搞懂 transient 关键字了吗?

先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。 Java序列化技术正是将对象转变成一串由二进制字节组成的数组...

Java技术栈
03/06
49
0
Java序列化之Externalizable

1.需求 使用Externalizable实现序列化 2.Externalizable源码 public interface Externalizable extends java.io.Serializable { The object implements the writeExternal method to save it......

村长大神
2018/05/08
11
0
Serializable和Externalizable

Serailizable,类通过实现此接口使类对象可以被序列化,如把某对象保存到本地磁盘上,然后再从磁盘还原成jvm里的对象,代码如下: public static void main(String[] args) throws Exceptio...

伊森papa
2013/10/17
1K
0
Java序列化——transient关键字和Externalizable接口

提到Java序列化,相信大家都不陌生。我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化。那么当我们在序列化Java对象时,如果不...

摆渡者
2015/11/04
432
0
serialVersionUID作用

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较...

stefanzhlg
2015/03/23
529
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部