java程序设计——15对象序列化

上传人:第*** 文档编号:48877729 上传时间:2018-07-21 格式:PPT 页数:19 大小:473KB
返回 下载 相关 举报
java程序设计——15对象序列化_第1页
第1页 / 共19页
java程序设计——15对象序列化_第2页
第2页 / 共19页
java程序设计——15对象序列化_第3页
第3页 / 共19页
java程序设计——15对象序列化_第4页
第4页 / 共19页
java程序设计——15对象序列化_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《java程序设计——15对象序列化》由会员分享,可在线阅读,更多相关《java程序设计——15对象序列化(19页珍藏版)》请在金锄头文库上搜索。

1、计算机科学与技术学院 赵志崑 赵志崑数据存储问题 本课程前面介绍的数据存储方法: 用文本文件存储:通过Student对象与字符串的相互 转换进 行。 讨论: 上述方式适用的场合: 数据主要是字符串型; 用户希望能够方便的直接查看和修改存档文件。 不适用的场合: 数据主要是数值型; 数据量大; 用户不需要直接查看和修改存档文件。赵志崑数据流输入输出数据流直接将数据以内存中的格式输入输出。 数据流输入输出使用下面两个类: DataInputStream和DataOutputStream; 对于8种原始数据类型,分别使用8个不同的方法; 保存和读取要一一对应。见Account.java,DataSa

2、ve.java,DataRead.java class Account private long id;private double value;public void loadFromData(DataInputStream in) throws IOExceptionid = in.readLong(); value = in.readDouble();public void saveToData(DataOutputStream out) throws IOExceptionout.writeLong(id); out.writeDouble(value); FileInputStrea

3、mBufferedInputStreamDataInputStream文件数据DataOutputStreamBufferedOutputStreamFileOutputStream文件赵志崑与文本格式比较直接使用数据流与文本格式比较: 优点:速度快,文件占用空间小,文件不易修改; 缺点:文件不易读懂。 实验 : 随机创建1000000个Account对象,分别用文本格式和数据格式保存 。修改DataSave.java public static void main(String args) throws IOException for(int i = 0; i 100000; i+) lon

4、g id = i; double value = rand.nextDouble(); Account account = new Account(id, value); switch(flag) case 0:account.saveToData(dout); break; case 1:account.saveToText(bout); break; 赵志崑对象输入输出 问题: 要将一个对象的数据保存到文件中,如果用数据流,需要将 每个字段都保存,并且读出时要对应读 出。若对象数据字段 非常多,则比较繁琐,容易出错。 C语言的解决方法是将整个对象数据块作为一块内存 区保存。 用sizeof

5、运算符计算对象数据块的大小; 用造型将对象指针转 化为字符指针; 然后将该字符内存块保存到文件中。 Java的解决方法是用对象流。 对象的输入输出使用下面两个类: ObjectInputStream和ObjectOutputStream。赵志崑对象流输入输出对象流可以将一个对象完整的保存到文件上或从文件 读入。具体步骤如下: 对象实现Serializable(序列化)接口,该接口不需要实现 任何方法。 class Account implements Serializable 对象保存到文件时,创建ObjectOutputStream,调用 writeObject方法。 ObjectOutpu

6、tStream oout = new ObjectOutputStream(bout); oout.writeObject(account); 对象从文件读入时,创建ObjectInputStream,调用 readObject方法,再造型转换。 ObjectInputStream oin = new ObjectInputStream(bin); Account account = (Account)(oin.readObject(); 示例见ObjectRead.java,ObjectSave.java。 问题 :对象间的引用关系如何保存?FileInputStreamBufferedIn

7、putStreamObjectInputStream文件对象ObjectOutputStreamBufferedOutputStreamFileOutputStream文件赵志崑对象序列化 对象序列化并不是简单的将对象数据转化为一块字符 串内存区,而是使用一种比较完善复杂的特殊格式来 存储对象数据。 存储格式中包括标志、版本号、序列号、类标识 符、校验特 征码等。 对象序列化使用说明: 对象序列化机制完全由Java自动完成,编程时只需使用对象 流的readObject和writeObject方法即可完成对象的读取和保存 ; 不同类的对象可以保存到一个文件中; 对象的类字段(static)和临时

8、 字段(transient)不会被保存。 对象之间的相互引用关系也会保存。 从接口的继承关系上来看,ObjectInput和ObjectOutput分别是 DataInput和DataOutput的子接口,所以,ObjectInputStream和 ObjectOutputStream也可以直接存取原始数据类型。赵志崑不同类对象保存到一个文件中 Java的序列化机制和单一继承性,使得属于不同类的 对象可以保存到一个文件中。 在下面的例子中,产生10个对象,每个对象随机的属于 Human或Computer类,然后存放到文件data.dat中。MultiObjectSave.java public

9、 static void main(String args) throws IOExceptionfor(int i = 0; i 10; i+) if(rand.nextInt()5) Human h = new Human(i, M); oout.writeObject(h);else Computer c = new Computer(1.0F,i); oout.writeObject(c); MultiObjectRead.java public static void main(String args) throws IOExceptionint n = 10;for(int i=0

10、; in; i+) Object o = oin.readObject(); System.out.println(o); 赵志崑对象和原始数据类型混合保存ObjectInputStream和ObjectOutputStream也可以直接存取原始数据 类型。 所以文件中可以先保存一个对象数量。Object InputStreamData InputStreamDataInputObjectInputObject OutputStreamData OutputStreamDataOutputObjectOutputMultiObjectSave.java public static void m

11、ain(String args) throws IOExceptionoout.writeInt(10);for(int i = 0; i 10; i+) if(rand.nextInt()5) Human h = new Human(i, M); oout.writeObject(h);else Computer c = new Computer(1.0F,i); oout.writeObject(c); MultiObjectRead.java public static void main(String args) throws IOExceptionint n = oin.readIn

12、t();for(int i=0; in; i+) Object o = oin.readObject(); System.out.println(o); 赵志崑对象间引用关系的保存 问题: 如果一个对象(Human)的字段中有对另一个对象(Computer)的引 用,那么变量(computer)中保存的是对象(Computer)的内存地址 。那么,将Human和Computer保存到文件后,下次读出时,无 法保证Computer被保存到同一内存地址。 解决方法: Java序列化机制也自动解决对象间引用关系保存的问题 。long id;HumanComputer computer;long id

13、;Computer具体方法(对象序列化):为每个对象分配一个唯一的序列号;对象中有引用字段指向其他对象,同时也保存该对象。对象保存到文件之前,先检查同一对象是否已经保存过,如果是,则只保存对象的序列号;否则,保存对象的全部内容。赵志崑第一种情况Human对象的computer字段指向Computer对象。 保存Human对象时,同时也保存了Computer对象。 读取Human对象时,同时也读取了Human对象。 这种机制使得String等类型的引用字段可以同原始数据类型一样 处理。long id;HumanComputer computer;long id;ComputerRelationR

14、ead.java public static void main(String args) throws IOException Human h1 = (Human)(oin.readObject();System.out.println(h1); RelationSave.java public static void main(String args) throws IOException Computer c1 = new Computer();Human h1 = new Human(c1);oout.writeObject(h1); 赵志崑第二种情况h1的computer字段指向c1

15、,h2的computer字段也指向c1。 保存对象h1时,同时也保存了c1对象; 保存h2对象时,需要再次保存c1,此时只保存c1的序列号; 读取h1对象时,同时也读取了c1对象; 读取h2对象时,需要再次读取c1对象,此时直接使用内存中的c1对象。 这种机制使得对象间的引用关系得以完整保存。 RelationSave.java public static void main(String args) throws IOExceptionComputer c1 = new Computer();Human h1 = new Human(c1);oout.writeObject(h1);Human h2 = new Human(c1);oout.writeObject(h2); RelationRead.java public static void main(String args) throws IOExceptionHuman h1 = (Human)(oin.readObject();System.out.println(h1);Human h2 = (Human)(oin.readObject();System.out.println(h2);System.out

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号