簡體   English   中英

Java中2個不同JVM上類的對象的序列化

[英]Serialization of an Object of a class on 2 different JVMs in java

我有一堂課,說Counter。 我在一台機器上在JVM-1上序列化此類的對象,然后將序列化的對象作為網絡流傳輸到另一台機器上,並在JVM-2中反序列化。 該對象會正確反序列化嗎? 在這種情況下會拋出任何錯誤/異常嗎? 假設我已經在兩個JVM上編譯了該類。 我假設類中不存在串行版本UID

只要兩端都運行相同的代碼/ jdk(盡管可以使用不同的jdk),則序列化/反序列化將不是問題。

如果您的類中有serialVersionUID,則序列化/反序列化將不是問題,但是如果您的代碼中缺少serialVersionUID,則因為您正在使用兩個JVM編譯類(我知道,.class文件具有相同的內容,但使用不同的JVM編譯)在這種情況下,serialVersionUID由java分配,這將是不一樣的,因此序列化/反序列化將不起作用。 因此,添加

private static final long serialVersionUID = -6903933977591709194L;

如果您沒有添加任何值,並且可以進行多次編譯,請放心,序列化/反序列化將起作用。 :)

序列化運行時與每個可序列化的類關聯一個版本號,稱為serialVersionUID,在反序列化期間使用該版本號來驗證序列化對象的發送者和接收者是否已加載了該對象的與序列化兼容的類。 如果接收方已為該對象加載了一個與相應發送方類具有不同的serialVersionUID的類,則反序列化將導致InvalidClassException。 可序列化的類可以通過聲明一個名稱為“ serialVersionUID”的字段來顯式聲明其自己的serialVersionUID,該字段必須是靜態的,最終的且類型為long:

ANY-ACCESS-MODIFIER靜態最終長serialVersionUID = 11L;

如果可序列化的類未明確聲明serialVersionUID,則序列化運行時將根據該類的各個方面,為該類計算默認的serialVersionUID值,如Java(TM)對象序列化規范中所述。 但是,強烈建議所有可序列化的類顯式聲明serialVersionUID值,因為默認的serialVersionUID計算對類詳細信息高度敏感,而類詳細信息可能會根據編譯器的實現而有所不同,因此可能在反序列化期間導致意外的InvalidClassExceptions。 因此,為了保證不同Java編譯器實現之間的serialVersionUID值一致,可序列化的類必須聲明一個顯式的serialVersionUID值。 還強烈建議顯式serialVersionUID聲明在可能的情況下使用private修飾符,因為此類聲明僅適用於立即聲明的類-serialVersionUID字段作為繼承成員沒有用。 數組類無法聲明顯式的serialVersionUID,因此它們始終具有默認的計算值,但是對於數組類,無需匹配serialVersionUID值。

如果接收方已為該對象加載了一個與相應發送方類具有不同的serialVersionUID的類,則反序列化將導致InvalidClassException。 可序列化的類可以通過聲明一個名稱為“ serialVersionUID”的字段來顯式聲明其自己的serialVersionUID,該字段必須是靜態的,最終的且類型為long

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM