ObjectInputStream与ObjectOutputStream的作用是:对基本数据和对象进行序列化操作进行支持。其中ObjectInputStream对象提供对基本数据和对象对持久存储,当我们需要读取这些存储这些基本数据或对象时,可以创建文件输入流对应的ObjectInputStream,进而读取这些基本数据或对象。

序列化有关的基础知识:
1 需要序列化的类必须实现java.io.Serializable接口,否则会抛出NotSerializableException异常。
2 如果检测到反序列化的类的serialVersionUID和对象二进制流的serialVersionUID不同,则会抛出异常。
3 Java序列化会将一个类中包含的引用中的所有的成员变量保存下来,所以里面的引用类型也要实现java.io.Serializable的接口。
4 对于不用采用默认序列化或无需序列化的成员变量,可以添加transient关键字,并不是说添加了transient关键字就一定不能序列化。
5 每一个类可以实现readObject、writeObject等方法实现自己的序列化策略,即使是transient修饰的成员变量也可以手动调用ObjectOutputStream的write*等方法,将成员变量序列化。

ObjectOutputStream 有关方法

1 public ObjectOutputStream(OutputStream out) throws IOException {} 
* 创建一个ObjectOutputStream去写入指定的OutputStream,此构造函数将序列化流头写入底层流,调用者需要立即刷新流,以确保用于接收ObjectInputStreams的构造函数在读取该头时不会阻塞。

2 protected ObjectOutputStream() throws IOException, SecurityException {}
* 为完全重新实现ObjectOutputStream的子类提供一种方法,使其不必分配仅由ObjectOutputStream的实现使用的私有数据

3 public void useProtocolVersion(int version) throws IOException {}
* 指定在编写流时使用的流协议版本

4  public final void writeObject(Object obj) throws IOException {}
* 将指定的对象写入ObjutoExtStudio流,对象的类、类的签名、类及其所有超类型的非瞬态和非静态字段的值都可以通过该方法写入,重写writeObject和readObject方法可以将默认的序列号重写,该对象引用的对象是通过传递方式编写的,以便ObjectInputStream可以重构等效的、完整的对象。

本文固定链接: http://www.js-code.com/ios/ios_52899.html