为什么Java基于值的类不应该被序列化?
从版本8开始,Java具有基于值的类的概念。这是在准备一个未来的版本,该版本很可能允许定义值类型。两个定义/描述都提到了序列化(粗体字由我添加):
关于现有的基于值的类:
如果程序尝试区分对基于值的类的相等值的两个引用,则可能会产生不可预知的结果,无论是直接通过引用相等还是通过对同步、标识哈希、序列化或任何其他标识敏感机制的调用间接区分。
关于未来的值类型:
对象的默认基于标识的哈希代码(可通过 System.identityHashCode 获得)也不适用于值类型。内部操作(如序列化)对对象进行基于标识的区分要么不适用于值(因为它们不适用于基元),要么将使用值类型的 hashCode 方法提供的基于值的区分。
因为将来的 JVM 实现可能不会对基于值的类使用对象头和引用指针,所以一些限制是显而易见的。(例如,不锁定 JVM 不得维护的身份。锁定的引用可以删除,并在以后由另一个引用替换,这使得释放锁定变得毫无意义,并且会导致死锁)。
但我不明白序列化是如何发挥作用的。为什么它被认为是一种“身份敏感机制”?为什么它“对对象进行基于身份的区分”?