gpt4 book ai didi

java - 与对象序列化期间计算的 SUID 混淆

转载 作者:太空宇宙 更新时间:2023-11-04 11:07:30 26 4
gpt4 key购买 nike

我正在阅读序列化,并对对象序列化过程中计算的 SUID 如何传递到另一台机器感到困惑。下面的查询是在一台机器中序列化对象并将其传递到另一台机器的上下文中进行的。

a) 为什么 suid 是静态的?b) 如果它是静态的,并且如果我们仅通过网络将序列化对象传递到另一台机器,那么其他 JVM 如何知道在第一台机器中计算的 SUID。由于计算的suid是静态的,并且对象是序列化的,其他JVM如何知道为序列化对象计算的SUID。

我用谷歌搜索但找不到合适的答案。提前致谢。

最佳答案

如果我正确理解了你的问题,你想了解SUID在内部是如何使用的。让我继续,以确保我们共享相同的信息。

序列化允许您将 Activity 对象转换为字节序列,以便将其存储在某处或通过线路传输。更准确地说,序列化保存对象的状态。

序列化还可以用于将对象发送到不同的环境,其中也存在具有相同名称的类。序列化契约告诉我们,相同的对象类型必须具有相同的 SUID:所以例如如果生成 SUID=1 的“Foo”对象的序列化,则仅当相关 Foo 类定义 SUID=1 时,才可以将其反序列化为 Foo 的实时实例(否则将抛出 InvalidClassException)。

反序列化过程会恢复类字段(非静态和非 transient 字段 - 这就是 SUID 是静态的原因),但 SUID 必须相同。无论如何,如果您不声明 SUID,JVM 会为您计算一个 SUID(作为类本身的哈希值,而不是对象的哈希值)并将其用作默认值,将其添加到序列化对象中。序列化规范建议始终在可序列化对象上显式定义 SUID,因为无法保证 SUID 的自动评估在不同 JVM 上相同,因此序列化器上的 SUID 评估可能与反序列化器上的评估不同(导致 - 和以前一样 - InvalidClassException)。

您可以在此处找到更多详细信息: https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100

PS:您可以通过查看java.io.ObjectStreamClass.computeDefaultSUID(Class<?> cl)来了解如何评估类的自定义SUID。源代码。

关于java - 与对象序列化期间计算的 SUID 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46344959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com