ObjectInputStream和ObjectOutputStream是Java中用于对象序列化和反序列化的重要工具,它们属于Java I/O库中的对象流。
基本功能:
- ObjectOutputStream:主要用于将Java对象(必须是实现了Serializable接口的类的对象)写入输出流中,实现对象的持久化存储或网络传输。它提供了writeObject(Object obj)方法,用于将对象写入输出流。
- ObjectInputStream:与ObjectOutputStream相反,它用于从输入流中读取Java对象,实现对象的反序列化。它提供了readObject()方法,用于从输入流中读取并返回对象。
序列化与反序列化:
- 序列化:将对象的状态信息转换为字节序列的过程,以便可以持久保存(如写入文件或保存到数据库)或通过网络传输到另一个虚拟机。
- 反序列化:将字节序列恢复为对象的过程。也就是说,从字节序列中读取对象的状态信息,并使用这些信息重新构造对象。
特点:
- ObjectInputStream和ObjectOutputStream不仅可以处理基本数据类型的数据,还可以处理Java对象。
- 序列化的字节序列是平台无关的,可以在不同的Java虚拟机之间传输。
- 只有实现了Serializable接口的类的对象才能被序列化。如果对象的属性是对象,那么这些属性的类也必须实现Serializable接口。
- 序列化时,默认会将对象的所有非static和非transient修饰的成员进行序列化。如果希望某些成员不被序列化,可以使用transient关键字进行修饰。
注意事项:
- 读写顺序要一致:在序列化和反序列化时,对象的成员变量的写入和读取顺序必须一致。
- Serializable接口是一个标记接口,没有任何方法需要实现,只是用于告知Java虚拟机该对象可以被序列化。
- 序列化具有可继承性,即如果某个类实现了Serializable接口,那么它的所有子类也默认实现了Serializable接口。
使用场景:
- 当需要将对象的状态保存到文件中时,可以使用ObjectOutputStream。
- 当需要从文件中恢复对象的状态时,可以使用ObjectInputStream。
- 在网络编程中,当需要在不同的Java虚拟机之间传输对象时,也可以使用ObjectOutputStream和ObjectInputStream。