如果应用程序从不依赖于其对象标识,那么序列化基于值的对象是否可以?

sag*_*gar 5 serialization java-8 java-9 project-valhalla

声纳显示

使这个基于值的字段瞬态,因此它不包含在此类的序列化中.

这是一个面向未来的错误,当基于价值的类将被释放时.

那么,如果应用程序永远不依赖于它的对象标识,那么我可以使基于值的对象非瞬态吗?

Hol*_*ger 6

要使基于值的类的字段非瞬态,基于值的类必须是可序列化的.所以它实际上是一个没有你做出的设计决定.

如果设计者声明一个类是基于值和实现的Serializable,那么他们认为基于值的类和序列化是兼容的并且将保持不变.

我们不知道最终值类型实现将如何,但JRE开发人员提供的迁移路径,例如在引入不可变列表时,应该采用基于值和可序列化的,而不是假设有额外的超出规范的规则和约束.

毕竟,没有理由认为序列化不适用于值类型.它也支持原始值,并且在过去也已经过调整,例如在enum添加支持时.目前尚不清楚它是否总是存储值,或者仍然支持像普通对象一样支持返回引用或执行完全不同的规范化,但只要你不依赖于对象标识,就像你的前提一样,你在安全方面,因为任何一种策略都适用于您的代码.

  • @Eugene:总是使用`equals`而不是`==`一般适用于值类型.现在,序列化保存和恢复使用反向引用已经遇到的物体的身份,但由于价值类型有不明身份,你不能靠这个.未来的版本可能会表现得好像使用`writeUnshared`,但相反也有可能,相同的值可能会变得相同的情况下(如果你认为他们是静物)... (3认同)