2017-09-21 19 views
1

我正在读取序列化并与在对象序列化过程中计算的SUID如何传递到另一台计算机时混淆。在对象上下文中的查询在一台机器中序列化并传递给另一台机器。在对象序列化期间计算的SUID混淆

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

我gooogled,但无法找到适当的答案。提前致谢。

回答

0

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

序列化允许您将活动对象转换为字节序列,以便将其存储在某个地方或通过电线传输。更确切地说,序列化保存了一个对象的状态。

序列化也可以用来发送一个对象到一个不同的环境,在那里有一个同名的类也存在。序列化合同告诉相同的对象类型必须具有相同的SUID:例如,如果生成SUID为1的“Foo”对象的序列化,则只有在相关的Foo类定义SUID = 1(或将引发InvalidClassException)时,才能将其反序列化为Foo的实例。反序列化过程可以恢复类字段(非静态和非暂态类型 - 这就是为什么SUID是静态的),但SUID必须相同。无论如何,如果你没有声明SUID,JVM会为你评估一个(作为类本身的散列 - 而不是对象的散列),并将其用作默认值,并将其添加到序列化对象中。序列化规范建议始终在可序列化对象上明确定义SUID,因为不能保证SUID的自动评估在不同的JVM上是相同的,所以可能发生SUID对串行器的评估与解串器上的评估不同(导致之前 - 一个InvalidClassException)。

你可以在这里找到更多的细节: https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100

PS:你可以找到如何定制SUID一类是通过观察java.io.ObjectStreamClass.computeDefaultSUID(Class<?> cl)源代码进行评估。

+1

“反序列化过程恢复类字段(非静态和非暂态类型 - 这就是为什么SUID是静态的)”这实际上是我应该想到的。非常感谢你的解释。 – paras4all