在Java中使用`ObjectOutputStream`将多个对象顺序写入同一个文件,然后使用`ObjectInputStream`从该文件中读取这些对象。考虑以下场景:首先写入了一个`Student`对象,然后写入了一个`Teacher`对象,之后写入了一个`null`对象。在读取时,如果错误地尝试先读取`Teacher`对象,然后再读取`Student`对象,会发生什么情况?假设`Student`和`Teacher`类都实现了`Serializable`接口。
答案解析
选项A错误,`EOFException`通常发生在试图读取超出文件末尾的数据时,而不是读取顺序错误。选项B错误,`ClassCastException`通常发生在尝试将一个对象强制转换为不兼容的类型,而读取流的对象类型是正确的,只是顺序错了。选项C错误, `ObjectInputStream`不会将类型进行错误地转换,只会按照写入顺序读取。选项D正确,由于对象序列化时,对象按照写入的顺序存储在流中,`ObjectInputStream`也必须按照相同的顺序读取。如果读取顺序与写入顺序不一致,比如先尝试读取`Teacher`对象,但实际上下一个对象是`Student`对象,`ObjectInputStream`会尝试按照指定的类型进行读取,但是由于数据内容与类型不匹配,可能抛出 `InvalidClassException`或其他`IOException`,或者读取结果不正确(取决于具体JVM实现),重点是读取指针是单向的,无法回溯,强行改变读取顺序会造成错误。读取顺序必须与写入顺序严格匹配。
正确答案:D