ObjectInputStream对反序列化的读取顺序和读取次数要求非常严格。
以下列为例,序列化写入顺序为:
oop = new ObjectOutputStream(new FileOutputStream(destPath));
oop.writeInt(100);
oop.writeBoolean(true);
oop.writeChar('我');
oop.writeUTF("爱java");
oop.writeObject(new Dog("大黄",10,"white","china",new Master()));
System.out.println("数据序列化完成!");
如果反序列化顺序错误,会抛出OptionalDataException异常。
System.out.println(ois.readUTF());//字符串应在char后面,object之前读取。
System.out.println(ois.readInt());
System.out.println(!ois.readBoolean());
System.out.println((char)(ois.readChar() + 3));
System.out.println(ois.readObject());
抛出异常
Exception in thread "main" java.lang.RuntimeException: java.io.OptionalDataException
若顺序无误,读取完一遍后接着再读取则会抛出EOFException异常(End Of File Exception)。
System.out.println(ois.readInt());
System.out.println(!ois.readBoolean());
System.out.println((char)(ois.readChar() + 3));
System.out.println(ois.readUTF());//字符串应在char后面,object之前读取。
// System.out.println(ois.readInt());
// System.out.println(!ois.readBoolean());
// System.out.println((char)(ois.readChar() + 3));
System.out.println(ois.readObject());
// 如下再读取一遍object
System.out.println(((Dog)ois.readObject()).getAge());
抛出异常
100
false
戔
爱java
Dog{name='大黄', age=10, nation='null', master=com.gxmedu.two_object_stream.Master@66a29884}
Exception in thread "main" java.lang.RuntimeException: java.io.EOFException