假设我有一个ArrayList<B>
array
来自某个类的对象B
,它扩展了A
。B
有一个实例字段bb
和A
一个字段aa
。我知道使用保存array
到 .dat 文件ObjectOutputStream
需要B
(不仅仅是ArrayList
!)实现Serializable
。但是,我发现从文件中加载对象时(使用ObjectInputStream
):
arrayLoaded = (ArrayList<B>)myObjIn.readObject();
加载的数组与原始数组不同:在特定情况下,arrayLoaded.get(0).bb
具有与 in 相同的值array
,但arrayLoaded.get(0).aa
被“归零”。它有一个默认的初始化值,不管它在array
保存到文件时的值。但是,这个问题可以通过让也A
实现来解决Serializable
。
困扰我的是这个错误是如此微妙:没有例外,没有警告(在 Eclipse 中),什么都没有。这是有原因的还是仅仅是Java开发人员的疏忽?Serializable
每次我想使用对象 IO 流时,我是否只需要接受它并认真考虑层次结构中的哪些类实现?