我正在研究有效Java,第75条:


  如果所有实例字段都是瞬态的,则从技术上讲,
  无需调用defaultWriteObject和defaultReadObject,但是
  不推荐。即使所有实例字段都是瞬态的,
  调用defaultWriteObject会影响序列化的表单,从而导致
  大大增强了灵活性。生成的序列化表格使其成为
  可以在以后的版本中添加非瞬态实例字段,而
  保持向前和向后的兼容性。如果一个实例是
  在更高版本中序列化并在早期版本中反序列化,
  添加的字段将被忽略。拥有较早版本的readObject
  方法无法调用defaultReadObject,反序列化将
  失败,并发生StreamCorruptedException


问题是,为什么必须调用defaultReadObject / defaultWriteObject来保持向后和向前的兼容性?

你能举个例子解释吗?

为什么添加的字段将被忽略?

为什么会引发StreamCorruptedException?

最佳答案

因为默认情况下就是这样。如果添加这些方法,则至少必须做一些如果不存在会发生的事情。否则,您将不会以兼容的方式读取/写入流。您不能完全替换本来会写的内容而不会冒兼容性的风险。

除非您可以同时神奇地更改两端并且在任何地方都没有永久序列化的流,例如在文件或数据库中。

10-08 09:34