对象输入流ObjectInputStream

本文介绍了Java中如何使用ObjectInputStream进行对象的反序列化,并通过一个具体的例子展示了如何读取序列化后的Person对象。讨论了序列化接口的选择及其对未来版本的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12.16.3  对象输入流ObjectInputStream

使用ObjectInputStream可以直接把被序列化好的对象反序列化。ObjectInputStream的定义如下:

  1. public class ObjectInputStream  
  2. extends InputStream  
  3. implements ObjectInput, ObjectStreamConstants 

ObjectInputStream类也是InputStream的子类,与PrintStream类的使用类似。此类同样需要接收InputStream类的实例才可以实例化。主要操作方法如表12-26所示。

表12-26  ObjectInputStream的主要操作方法

序号

    

类型

    

1

public ObjectInputStream(InputStream in)

throws IOException

构造

构造输入对象

2

public final Object readObject

() throws IOException, 
ClassNotFoundException

普通

从指定位置读取对象

下面使用对象输入流将 12.16.2 节保存在文件中的对象读取出来,此过程也称为反序  列化。

范例:从文件中将Person对象反序列化(读取)

  1. package org.lxh.demo12.serdemo;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.InputStream;  
  5. import java.io.ObjectInputStream;  
  6. public class SerDemo02 {  
  7.     public static void main(String[] args) 
    throws Exception {  
  8.         File f = new File("D:" + File.separator + "test.txt");  
  9.         ObjectInputStream ois = null;  
  10.         InputStream input = new FileInputStream(f);
    // 文件输入流  
  11.         ois = new ObjectInputStream(input);   
    // 为对象输出流实例化  
  12.         Object obj = ois.readObject();      
    // 读取对象  
  13.         ois.close();                          
    // 关闭输出  
  14.         System.out.println(obj);  
  15.     }  

程序的运行结果:

  1. 姓名:张三;年龄:30 

从程序的运行结果中可以清楚地发现,实现了Serializable接口类,对象中的所有属性都被序列化,如果用户想根据自己的需要选择被序列化的属性,则可以使用另外一种序列化接口--Externalizable接口。

提问:可不可以让所有的类都实现Serializble接口?

一个类如果实现了Serializable接口后可以直接序列化,而且此接口中没有任何的方法,也不会让实现此接口的类增加不必要的操作,那么所有的类都实现此接口不是更好吗?这样也可以增加类的一个功能。

回答:不可以,这样在以后的版本升级中会存在问题。

在目前已知的JDK版本中,java.io.Serializable接口中都没有定义任何的方法,所以如果所有的类都实现此接口在语法上并没有任何的问题,但是,如果在以后的JDK版本中修改了此接口而且又增加了许多方法呢?那么以往的系统中所有类就都被修改,这样肯定会很麻烦,所以最好只在需要被序列化对象的类实现Serializable接口。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值