为什么Java的基于价值的类不能被序列化?

从版本8开始,Java具有基于值的类的概念。 这是为了准备将来很可能允许定义值类型的未来版本。 这两个定义/描述都提到了序列化(由我添加的粗体):

关于现有的基于价值的课程:

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

关于未来的价值类型:

通过System.identityHashCode提供的对象的默认基于身份的哈希代码也不适用于值类型。 像序列化这样的内部操作会对对象进行基于身份的区分,这些操作要么不适用于值(因为它们不适用于基元),要么它们会使用值类型的hashCode方法提供的基于值的区别。

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

但我不知道序列化如何发挥作用。 为什么它被视为“身份敏感机制” ? 为什么它“以对象为基础进行基于身份的区分”

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

想想当序列化的对象图有一个循环时会发生什么。 在这种情况下,序列化算法将进入无限循环 – 除非它具有检测和解决循环的特定机制。 我们都知道Java的序列化允许循环对象图,因此机制就在那里。

现在考虑一个循环的定义 :该图包含一个可从其自身到达的对象。 该定义指的是对象的身份 ,这意味着该机制必须考虑对象身份来跟踪周期。 在实现级别上,这是通过维护所有看到的实例的IdentityHashMap来实现的,并且该类依赖于Object.identityHashCode()

您引用的句子解释了如何在未来的Java版本中解决此问题:将对值类型进行特殊处理,使得循环检测将依赖于它们自己的equalshashCode方法,而不是==identityHashCode