PAGE5
《面向对象程序设计》教案
第30讲
教学对象
计算机科学技术专业
授课内容
11.6对象序列化
编程实践
课程标准
教学目标
(一)知识目标
1.理解对象序列化和反序列化的概念
2.灵活应用字节流和字符流
(二)能力目标
1.能够熟练使用字节流和字符流进行文件的读写操作
2.能够熟练使用File类完成文件和目录的操作
教学方法
采用讲授法、演示法、讨论法、案例教学。
学时及分配(第1学时50分钟)
课堂讲授30分钟
课堂练习20分钟
11.6对象序列化
学时及分配(第2学时50分钟)
课堂讲授20分钟
课堂练习30分钟
编程实践
知识点分析
重点:
字符流和字节流的基本操作
File类的使用
难点:
字符缓冲流和字节缓冲流
序列化和反序列化
教学过程设计
内容
方式
问题导入
有时需要将对象持久化到永久存储设备中,以便保存对象的状态供以后检索。Java通过对象序列化(objectserialization)支持这一点。要序列化对象,即将其保存到永久存储设备中,可以使用ObjectOutputStream。要反序列化(deserialize)对象,即检索保存的对象,可使用ObjectInputStream。
内容要点
11.6.1对象序列化与对象流
将程序中的对象输出到外部设备(如磁盘、网络)中,称为对象序列化(serialization)。反之,从外部设备将对象读入程序中称为对象反序列化(deserialization)。一个类的对象要实现对象序列化,必须实现java.io.Serializable接口,该接口的定义如下。
publicinterfaceSerializable{}
Serializable接口只是标识性接口,其中没有定义任何方法。一个类的对象要序列化,除了必须实现Serializable接口外,还需要创建对象输出流和对象输入流,然后,通过对象输出流将对象状态保存下来,通过对象输入流恢复对象的状态。要序列化的类如果没有实现该接口,在序列化时将抛出java.io.NotSerializableException异常。
在java.io包中定义了两个类ObjectInputStream和ObjectOutputStream,分别称为对象输入流和对象输出流。ObjectInputStream类继承了InputStream类,实现了ObjectInput接口,而ObjectInput接口又继承了DataInput接口。ObjectOutputStream类继承了OutputStream类,实现了ObjectOutput接口,而ObjectOutput接口又继承了DataOutput接口。
11.6.2向ObjectOutputStream中写对象
若将对象写到外部设备需要建立ObjectOutputStream类的对象,构造方法为:
publicObjectOutputStream(OutputStreamout)
参数out为一个字节输出流对象。创建了对象输出流后,就可以调用它的writeObject()方法将一个对象写入流中,该方法格式为:
publicfinalvoidwriteObject(Objectobj)throwsIOException
若写入的对象不是可序列化的,该方法会抛出NotSerializableException异常。由于ObjectOutputStream类实现了DataOutput接口,该接口中定义多个方法用来写入基本数据类型,如writeInt()、writeFloat()及writeDouble()等,可以使用这些方法向对象输出流中写入基本数据类型。
下面代码将一些数据和对象写到对象输出流中。
varfos=newFileOutputStream(data.ser);
varoop=newObjectOutputStream(fos);
可向对象流中写基本类型和各种对象oos.writeInt(2022);
可向对象流中写基本类型和各种对象
oos.writeObject(你好);
oos.writeObject(LocalDate.now());
ObjectOutputStream必须建立在另一个字节流上,该例是建立在FileOutputStream上的。然后向文件中写入一个整数、字符串“你好”和一个LocalDate对象。
11.6.3从ObjectInputStream中读对象
若要从外部设备上读取对象,