当前位置: 首页 > 面试题库 >

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

百里海超
2023-03-14
问题内容

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

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

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

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

关于未来价值类型:

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

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

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


问题答案:

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



 类似资料:
  • 问题内容: Python 3.X的功能不能被依赖于排序异质序列,因为大多数对不同类型的是unorderable(数字类型喜欢,,等是一个例外): 相反,没有自然顺序的对象之间的比较是任意的,但在Python 2.x中是一致的,因此可以: 为了复制在Python 3.X的Python 2.x的行为,我写了一个类来用作key参数sorted(),这依赖于这样一个事实是保证只使用低于比较: 用法示例:

  • 问题内容: 违反情况是“避免使用类似’ArrayList’的实现类型;而应使用接口”。 以下行将纠正违规: 为什么要用后者List代替ArrayList? 问题答案: 在具体类型上使用接口是实现良好封装和松散耦合代码的关键。 在编写自己的API时遵循这种做法甚至是个好主意。如果这样做,以后您会发现,将单元测试添加到代码中(使用Mocking技术),并在将来需要时更改基础实现会更容易。

  • 如果我有一个可序列化的类, } 当我使用以下消息构建findBugs时,会显示此消息: 这个可序列化类定义了一个非原语实例字段,它既不是瞬态的、可序列化的,也不是java的。并且似乎没有实现可外部化的接口或readObject()和writeObject()方法。如果此字段中存储了不可序列化的对象,则此类的对象将无法正确反序列化。 田野应该是什么才不会看起来像虫子?

  • 我有一只这样的熊猫 我如何根据集合(例如)中的值对其进行排序 设置顺序=('1','3','2','4') 产量 谢谢

  • 问题内容: 如下代码: 引发以下异常: 我猜内部类具有一个允许对其私有访问的字段和方法的字段。声明内部类static 可以解决它,但是如果需要此访问权限怎么办?有没有一种方法可以在不包含封闭类的情况下序列化非静态内部类,例如通过引用外部类? 编辑:例如,仅在序列化之前才需要访问外部类。好的,编译器不知道这一点,但是我认为这就是关键字存在的原因。 问题答案: 如果InnerClass需要此访问权限怎

  • 所以我只是从移动到。像往常一样,一个看似简单的变化之后是一些副作用,包括吞下异常——抱歉咆哮。 这是我过去访问用户主体的方式: 出于某种原因,总是只返回用户名,而不是对象。这对我来说已经足够好了,所以我就这么做了。 现在我已经更改了令牌存储,确实返回了对象。我可以忍受这一点,但我想知道为什么这突然改变了——因为这一点,我不得不重构一些代码,因为到目前为止,我一直期望用户名来自。我也想知道我是否能改