10.4.8 ObjectInputStream/ObjectOutputStream类

更新于 2026年10月10日 版权声明
10.4.8 ObjectInputStream/ObjectOutputStream类

对象流(ObjectInputStream/ObjectOutputStream)可以实现对象序列化和反序列化。

对象序列化就是将对象(主要是对象的字段值)写入字节输出流,反序列化就是从字节输入流读出对象数据,重建(恢复)对象的过程。对象序列化和反序列化可用于轻量级的对象持久化(将对象写入磁盘文件中保存)及重建(恢复)、通过套接字传输对象或者进行Java远程方法调用(Java RMI)。

ObjectOutputStream将Java对象数据写入OutputStream。可以使用ObjectInputStream读取重建对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重建对象。

实现java.io.Serializable 接口的类对象才能被序列化或者反序列化,此接口是标识接口,即没有方法或字段的接口,仅用于表示此接口类型的对象可以序列化。

ObjectOutputStream类的writeObject(Object obj)方法用于将对象写入流中。所有对象(包括 String和数组)都可以通过writeObject写入。可将多个对象写入流中。必须使用与写入对象时相同的类型和顺序从相应ObjectInputstream中读回对象。

ObjectInputStream对以前使用ObjectOutputStream写入的对象进行反序列化。

ObjectInputStream类的readObject()方法用于从流读取对象。因为readObject()方法的返回值类型为Object,要使用向下转型获取所需类型的对象。

【例10.14】使用ObjectOutputStream和FileOutputStream序列化对象,将对象保存在磁盘文件D:\\works\\monkey.data中,然后使用ObjectInputStream和FileInputStream反序列化对象,将对象从磁盘文件D:\\works\\monkey.data中恢复出来。

图示

图示

图示

图示(https://www.daowen.com)

图示

图10.13 运行结果

运行结果如图10.13所示。

下面例子利用对象序列化和反序列化克隆对象,为了提高对象克隆效率,使用内存缓冲区作为数据源和数据目标,因此对象流(ObjectInputStream\ObjectOutputStream)需要与字节数组流(ByteArrayInputStream\ ByteArrayOutputStream)配合使用。

【例10.15】克隆对象。

图示

图示

图示

运行结果如图10.14所示。

需要注意的是,static(静态)字段和transient(瞬态)字段不参与序列化。如果不想序列化某些字段,要使用transient修饰符修饰这些字段。

图示

图10.14 运行结果

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)