回答
如果你看看java.io.ObjectStreamClass
那裏你可以看到它實際上是被序列化的。下面的方法:
java.io.ObjectOutputStream.writeClassDescriptor(ObjectStreamClass)
調用它調用下面的方法的方法:
java.io.ObjectStreamClass.getSerialVersionUID()
在調用哪個要麼計算serialVersionUID
或者使用一個類中聲明,發現之前到以下方法:
java.io.ObjectStreamClass.getDeclaredSUID(Class)
所以看起來這個靜態字段是一個例外,因爲規則中沒有對靜態字段進行序列化。如何讀取它here。
serialVersionUID不存儲在「序列化」對象的實例中,因爲它是一個靜態字段(它是類的一部分,而不是對象的一部分)。
因此,如果編譯的字節碼是實際定義的,那麼它是stored
,否則就是計算它。在java specification的詞中:
如果類已經定義了serialVersionUID,它將從類中檢索。如果serialVersionUID>未由類定義,則從虛擬機中類的定義計算。如果>指定的類不是可序列化或可外部化的,則返回null。
在Stream Unique Identifiers section中,說明了用於這種計算的算法。
這一段值得注意(這就是爲什麼當實現Serializable的類沒有明確定義serialVersionUID時IDE通常會顯示警告)。
注:強烈建議所有可序列化類中明確聲明的serialVersionUID值,因爲默認serialVersionUID的計算是對類的詳細信息高度敏感,可能取決於編譯器實現變化,從而可能導致在反序列化期間意外的serialVersionUID衝突,導致反序列化失敗。
serialVersionUID
是序列化運行時使用的特殊字段。這些都在Java文檔中描述爲java.lang.Serializable
串行版本UID未存儲在對象中;它是一個靜態字段,因此它存儲在類定義中。發生什麼事是,當你序列化一個對象時,關於它的類的信息也必須被存儲;否則將無法對對象進行序列化。存儲在類中的信息包括其名稱和它的序列版本UID。
你可以在這裏閱讀整個協議:http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html
總之,對於一個新的對象的條目都恰好是:
newObject:
TC_OBJECT classDesc newHandle classdata[]
這裏classDesc
是類的描述符可以是一個宣言一個新的類,一個空引用或對之前聲明的類的引用:
classDesc:
newClassDesc
nullReference
(ClassDesc)prevObject
新類的聲明建立了類的名稱和序列版本UID,可用於以後參考它的手柄,以及其他信息編碼爲classDescInfo
類:
newClassDesc:
TC_CLASSDESC className serialVersionUID newHandle classDescInfo
- 1. Java中的版本化序列化
- 2. 在eclipse中自動生成序列化版本uid
- 3. Java序列化不同的Java版本
- 4. EHCache和Java序列化版本控制
- 5. java序列化,serialVersionUID和類版本
- 6. 爲什麼序列化需要實現類中的串行版本UID?
- 7. Java Map/List序列化/反序列化與不同的Java版本?
- 8. ViewState和序列化對象版本化
- 9. 版本之間的序列化
- 10. Kryo:反序列化舊版本的類
- 11. (java)ObjectInputStream反序列化對象的錯誤版本
- 12. 序列化和反序列化實體框架版本
- 13. PHP序列化/反序列化qbasic版本
- 14. 在程序中讀取java卡的UID
- 15. EJB遠程方法中不匹配的序列化UID - java.util.date&DBTimestamp
- 16. 刪除boost xml序列化版本
- 17. Boost序列化版本信息
- 18. Java中ArrayList的序列化
- 19. 使用多個版本的序列化程序類處理Java自定義序列化?
- 20. 排序版本化的ModelAdmin
- 21. 序列化對象在所有版本的java中是否兼容?
- 22. 爲什麼使用序列版UID的隨機數?
- 23. 的Java序列化
- 24. 的Java序列化
- 25. Java序列化
- 26. Java序列化
- 27. Java序列化
- 28. 從文本文檔中序列化/反序列化數組列表問題Java
- 29. Java。序列化的陣列
- 30. 序列化Java中的Java函數8
@downvoter:你能評價你downvote? – jalopaba 2012-06-12 08:37:48
「相對」downvote。必須確保Jiri的更好的答案在最前面(否則不會降低)。你完全忽略了這個問題的核心,那就是JVM如何知道序列化數據的版本(如果它的UID沒有寫入流中,那當然是,即使它是靜態字段)。 – Thilo 2012-06-12 08:41:35