以下Java代码片段中,存在一个`ArrayList<Integer>`对象被写入到一个文件中,然后又从该文件中读取回来。在读取的过程中,假设发生了以下情况:在将对象写入文件后,但在读取对象之前,`ArrayList`类新增了一个新的私有字段。并且`ArrayList`类并没有显式地定义`serialVersionUID`。下列关于读取后的`ArrayList<Integer>`对象的描述,哪个是正确的?
答案解析
选项A错误,即使是Java内置类,版本不兼容问题也会导致反序列化失败。选项B错误,数据不会全部丢失,而是可能会因反序列化失败而导致异常。选项D错误,反序列化不会部分保留,要么全部成功,要么失败。选项C正确,当一个类没有显式地定义`serialVersionUID`时,Java虚拟机会根据类的结构自动生成一个`serialVersionUID`。如果类结构发生变化(例如增加了私有字段),自动生成的`serialVersionUID`也会随之变化。当反序列化时,JVM会比较序列化和反序列化时类的`serialVersionUID`,如果两者不一致,就会抛出`InvalidClassException`异常,从而导致反序列化失败。重要的是理解,即使是标准库的类,其`serialVersionUID`的改变也会导致版本不兼容问题。
正确答案:C