You are on page 1of 16

对象序列化

本课内容

 对象序列化的概念及实现
 Serialization API
 Externalizable 接口
 定制序列化
问 题

1. 如何保存数据?
– 保存在内存中(临时)
– 保存在数据文件中(文本数据类型)
– 保存在数据库中(支持有限数据类型…)

2. 如何以对象为单位保存数据?
对象序列化
 对象的持续性 ---- 可以永久性保存一个对象的
状态并在需要时获取该对象的信息(重新创建
一个完全相同的对象);
 对象序列化 ---- 通过写出对象的状态数据来记
录一个对象。
 对象序列化的主要任务:写出对象所有成员变
量的值,包括引用类型成员变量对应的对象的
信息。
对象序列化的实现方式

 要序列化一个对象,其所属的类必须实现以
下两种接口之一:
– Serializable
在流中必须保存有恢复成兼容类型对象所需的各
成员变量的值;
– Externalizable
类自身定义其对象的外部存储格式;
范例 2501

范例名称:对象序列化应用举例

范例文件:
– MySerializeObj.java
– ObjRead.java
– ObjectWrite.java
ObjectOutputStream 类
• ObjectOutputStream 类提供对象的序列化处理
(写出)功能:
FileOutputStream f = new FileOutputStream("tmp");
ObjectOutputStream s = new ObjectOutputStream(f);
s.writeObject("Today");
s.writeObject(new Date());
s.flush();

• writeObject 方法序列化指定的对象,并遍历该对
象对其它对象的引用,递归的序列化所有被引用
到的其它对象,从而建立一个完整的序列化流。
ObjectInputStream 类

• ObjectInputStream 类提供读取序列化对象的功能

FileInputStream in = new FileInputStream(“tmp”);
ObjectInputStream s =new ObjectInputStream(in);
String today = (String)s.readObject();
Date date = (Date)s.readObject();

• readObject 方法反序列化输入流中的下一个对象
,遍历该对象中所有对其它对象的引用,并递归
的反序列化这些引用对象。
Serialization API 结构
java.io.DataOutput java.io.DataInput

ObjectStreamConstants

ObjectOutput ObjectInput

java.io.OutputStream java.io.InputStream

ObjectOutputStream ObjectInputStream

java.io.Serializable java.io.Externalizable
ObjectOutput/ObjectInput
接口
 ObjectOutput 接口,通过继承 DataOutput 接口
来写出基本类型的数据。其中又定义了的一个
重要的方法 writeObject() ,用来写出引用类型
数据 ---- 对象;
 ObjectInput 接口是用来从存储流中读入对象的。
如果被序列化对象的类名没有找到,会产生例
外。
Serializable 接口

• Serializable 接口只是用来标识出一个类能够被
序列化,并未定义任何抽象方法
package java.io;
public interface Serializable {
}

• Serializable 接口的实现类必须拥有一个无参数
的构造方法。
范例 2502

范例名称:通过网络传送序列化对象
源 文 件: Server.java/Client.java
需 求: 在 TCP/IP 协议上用序列化对象作为
信息载
体传送数据
目 的:加深对对象序列化的理解,掌握典型
应用;
Externalizable 接口
 Externalizable 接口继承了 Serializable ,凡实
现 Externalizable 接口的类在序列化中由该类本
身来控制信息的写出和读入 ---- 定制序列化。
package java.io;
public interface Externalizable extends Serializable
{
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException;
}
范例示例 2503

范例名称:定制对象序列化举例
文件名称: ExternalExample.java
需 求:设计一个使用 Externalizable 方式实现的对

序列化类,来定制对象的存取。
目 的:熟悉 Externalizable 接口的使用方式

分 析: Serializable 和 Externalizable 的异同
序列化的内容
• 什么被序列化
– 成员变量(包括基本数据类型、数组、对其
它对象的引用)
– 类名
• 什么不被序列化
– static 的属性
– 方法
– 加了 transient 修饰符的属性
保护敏感数据
 当开发的类能控制特定资源时,需要注意对敏感数据的
保护。例如:一个 File 对象,当序列化保存后,该对象
所代表的资源可能发生了变化(文件被移动),这时对
它反序列化后,则会产生错误。

 所应采取的措施:
1. 将敏感数据定义为 private transient ,不进行序列化

2. 敏感类则不应实现 Serializable 或 Externalizable 接口

3. 可在 writeObject 和 readObject 方法中检查敏感数据
的有效性,如无效,则可抛出
NotSerializableException 。

You might also like