为什么不应该对Java的基于值的类进行序列化?


问题内容

从版本8开始,Java具有 基于值的

的概念。这是为将来的版本做准备,该版本很可能将允许定义值类型。这两个定义/描述都提到了序列化(我加粗体):

关于现有的基于价值的类:

如果程序试图将两个引用区分为基于值的类的相等值,则可能会产生不可预测的结果,无论是直接通过引用相等还是间接地通过调用同步,标识哈希, 序列化
或任何其他标识敏感的机制。

关于未来价值类型:

可通过System.identityHashCode获得的对象的基于身份的默认哈希码也不适用于值类型。诸如 序列化之
类的内部操作对对象进行基于标识的区分将不应用于值(因为它们不适用于基元),否则它们将使用值类型的hashCode方法提供的基于值的区分。

因为将来的JVM实现可能不会为基于值的类使用对象标头和引用指针,所以某些限制很明显。(例如,不锁定JVM不能维护的身份。可以删除已被锁定的引用,并在以后用另一个引用替换,这将导致释放锁定毫无意义,并会导致死锁)。

但是我不了解序列化如何发挥作用。为什么将其视为 “身份敏感机制” ?为什么它 “对对象进行基于身份的区分”


问题答案:

序列化使用System.identityHashCode(通过IdentityHashMap)来确保反序列化产生的对象图的拓扑在拓扑上与输入图的拓扑相同。