2017-09-21 21 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