爲什麼序列化需要實現類中的串行版本UID?爲什麼序列化需要實現類中的串行版本UID?
回答
從the doc for java.ioSerializable
:
序列化運行時相關聯,每個序列化類版本號,稱爲的serialVersionUID,其被反序列化過程用於驗證序列化對象的發送者和接收者都加載的類爲對於序列化兼容的對象。如果接收者已經爲具有與相應的發送者類不同的serialVersionUID的對象加載了一個類,那麼反序列化將導致
InvalidClassException
。可序列化類可以通過聲明名爲"serialVersionUID"
字段必須是靜態的,最終明確宣佈了自己的serialVersionUID,並鍵入長
你問爲什麼一個UID?
因此它知道兩個序列化的對象是否相互兼容。你可能已經改變了界面/方法/等。
UID是(確實相當不起眼的)合同,說這兩個對象實際上是同一個類型對象。
的的serialVersionUID用作Serializable類版本控制。如果您沒有明確聲明serialVersionUID,則JVM將根據您的Serializable類的各個方面自動爲您執行此操作,如Java(TM) Object Serialization Specification中所述。
爲什麼序列化需要 串行版本的UID實現了 類?
它根本不需要它。這是一個可選功能。
可選的含義,它會在運行時自動生成,而序列化......它的簡單或者你明確地給它或編譯器將生成序列版本的UID。 – 2015-05-22 05:29:00
@ Anandj.Kadhi No. * JVM *將生成它,特別是ObjectOutputStream和朋友。它仍然是可選的,它仍然不是由編譯器生成的。不要在這裏發佈錯誤信息。 – EJP 2017-01-05 09:43:38
在規範中提到'但是,強烈建議所有可序列化的類顯式聲明serialVersionUID值,因爲默認的serialVersionUID計算對類詳細信息高度敏感,可能因編譯器實現而異,因此可能會導致意外的InvalidClassExceptions在反序列化過程中'意味着不同的編譯器實現會導致不同的serailVersionUID,因此我提到'編譯器'。請刷新您的信息 – 2017-01-06 06:28:11
- 1. 爲什麼需要實現可串行化接口?
- 2. 爲什麼要實現實體類序列化
- 3. Java中的序列化版本uid
- 4. 反序列化SortedSet:爲什麼項目需要實現IComparable?
- 5. 爲什麼我需要我需要在子類中實現IDisposable()
- 6. 爲什麼我們不需要實現Serializable來序列化爲xml
- 7. 爲什麼它需要將類標記爲可序列化?
- 8. 爲什麼序列化對象需要序列化
- 9. 爲什麼我的異常類需要序列化?
- 10. 使用rustc_serialize反序列化JSON對象:爲什麼需要實現PartialEq?
- 11. 需要幫助在Django中實現基本序列化器
- 12. 爲什麼SDL_GetWindowWMInfo()需要SDL版本?
- 13. 爲什麼使用序列版UID的隨機數?
- 14. 序列化Java:哪些類需要「實現Serializable」?
- 15. 爲什麼UIAlertView需要本地化?
- 16. 爲什麼XmlSerializer需要聲明爲public的序列化對象的類?
- 17. 爲什麼Java中的HttpServlet實現可序列化?
- 18. 在eclipse中自動生成序列化版本uid
- 19. 實現接口的抽象類不需要方法實現。爲什麼?
- 20. 爲什麼升壓串行化使用的類版本限制爲8位?
- 21. 爲什麼這個類不需要實現IEnumerable?
- 22. Angular2需要什麼版本的TypeScript?
- 23. 需要什麼版本的OpenSSL與sha256WithRSAEncryption
- 24. MVC 2需要什麼版本的.net?
- 25. Play 1.2.2需要什麼版本的jdk?
- 26. 我需要什麼版本的Crystal?
- 27. zxing 1.7需要什麼版本的Java?
- 28. 爲什麼我們需要序列化的Web服務
- 29. 可序列化類的子類需要可序列化?
- 30. 爲什麼申請需要序列號?
亞iam問爲什麼該序列版本的UID需要? – developer 2011-04-07 04:43:14