首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不序列化Java的基于值的类?

为什么不序列化Java的基于值的类?
EN

Stack Overflow用户
提问于 2014-10-19 14:37:12
回答 2查看 4.1K关注 0票数 20

自从第8版以来,Java就有了 classes的概念。这是在准备一个未来的版本,它很可能允许定义value types。这两种定义/描述都提到了序列化(我添加了粗体):

关于现有的基于值的类:

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

关于未来价值类型:

对象的默认基于身份的哈希代码(可通过System.identityHashCode获得)也不适用于值类型。内部操作(如序列化)使基于身份的对象区分不适用于值(因为它们不适用于原语),或者使用由值类型的hashCode方法提供的基于值的区别。

因为将来的JVM实现可能不会对基于值的类使用对象头和引用指针,所以有些限制是显而易见的。(例如,不锁定JVM不能维护的标识。一个被锁定的引用可以被移除,然后被另一个引用替换,这使得释放锁没有意义,并且会导致死锁)。

但我不明白序列化是怎么回事。为什么它被认为是一种“身份敏感机制”?为什么它要“对对象进行基于身份的区分”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-19 15:12:07

序列化使用System.identityHashCode (通过IdentityHashMap)来确保反序列化所产生的对象图的拓扑结构与输入图的拓扑等价。

票数 15
EN

Stack Overflow用户

发布于 2014-10-19 15:21:03

想想当被序列化的对象图有一个循环时会发生什么。在这种情况下,序列化算法将进入一个没完没了的循环--除非它具有检测和解析循环的特定机制。我们都知道Java的序列化允许循环对象图,因此存在这种机制。

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

您引用的句子解释了如何在未来版本的Java中解决这个问题:值类型将被给予特殊处理,以便循环检测将依赖于它们自己的equalshashCode方法,而不是==identityHashCode

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26451590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档