OptionalDataException异常是由两种原因导致的
- 异常表示由于未读原始数据导致对象读取操作失败
- 属于流中序列化对象的数据结束
事件经过
1.演示序列化存储数据时,存入顺序如下
String name = "mark";
int age = 22;
double score = 0.85;
boolean relive = true;
Student jack = new Student("jack", 23, 23.2, false);
2.读取顺序
String name = ois.readUTF();
int age = ois.readInt();
//少读了一个score
boolean relive = ois.readBoolean();
Object obj = ois.readObject();
3.运行报异常(OptionalDataException)
错误分析
当我将读取的对象【Object obj = ois.readObject()】注释后能够正常显示结果,哪怕中间跳过了一个score元素。
查阅文档【Class OptionalDataException】,得到的解释为未读原始数据导致对象读取操作失败
public class OptionalDataException extends ObjectStreamException异常表示由于未读原始数据导致对象读取操作失败,或者属于流中序列化对象的数据结束。 在两种情况下可能会抛出此异常:
- 当流中的下一个元素是原始数据时,尝试读取对象。 在这种情况下,OptionalDataException的长度字段设置为可立即从流中读取的原始数据的字节数,并且eof字段设置为false。
- 尝试通过类定义的readObject或readExternal方法读取可消耗数据的末尾。 在这种情况下,OptionalDataException的eof字段设置为true,length字段设置为0。
最终的解决办法是,老老实实的把前面的基本数据读取完,再去读取Object对象。
源码
@Test
public void test02() throws IOException, ClassNotFoundException {
/*
反序列化读取文件数据,实现数据的恢复
*/
FileInputStream fis = new FileInputStream("Student.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
String name = ois.readUTF();
int age = ois.readInt();
double score = ois.readDouble();
boolean relive = ois.readBoolean();
Object obj = ois.readObject();
System.out.println(name);
System.out.println(age);
System.out.println(score);
System.out.println(relive);
System.out.println(obj);
}