簡體   English   中英

當serialVersionId沒有存儲在序列化對象中時,反序列化過程如何知道序列化對象的serialVersionId?

[英]How deserialization process is aware of serialVersionId of the serialized object when serialVersionId is not stored in the serialized object?

當serialVersionId沒有存儲在序列化對象中時,反序列化過程如何知道序列化對象的serialVersionId,該序列化對象需要與要轉換為的類的串行版本ID進行比較,以檢查它是否兼容?

本文介紹Java對象的序列化形式:

AC ED: STREAM_MAGIC. Specifies that this is a serialization protocol.
00 05: STREAM_VERSION. The serialization version.
0x73: TC_OBJECT. Specifies that this is a new Object.
0x72: TC_CLASSDESC. Specifies that this is a new class.
00 0A: Length of the class name.
53 65 72 69 61 6c 54 65 73 74: SerialTest, the name of the class.
05 52 81 5A AC 66 02 F6: SerialVersionUID, the serial version identifier of this class.
(fields omitted)

serialVersionUID是一個static final long ,用它的類序列化。

如果您不為您的類手動提供一個,則序列化運行時將計算默認的serialVersionUID值。

您可以在以下網址找到更多詳細信息: http//docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

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

當序列化對象時,首先將其的描述符序列化(僅一次),並且該描述符包含serialVersionUID 它不作為對象靜態的一部分傳輸。

請參閱對象序列化規范,對象序列化流協議章節中的newClassDesc

暫無
暫無

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

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