我有一個java程序必須編譯爲1.4,另一個程序可以是任何東西(如1.4或1.6),並且這兩個程序需要來回傳遞序列化對象。如果我在兩個程序都可以看到的地方定義一個可序列化的類,那麼java的序列化是否仍然有效,還是僅需要1.6-1.6或1.4-1.4?Java序列化1.4 vs 1.6
回答
確保要序列化的類定義並將值賦予static final long serialVersionUID
,您應該沒問題。
這就是說,通常我不會這樣做。我的首選是在一個進程中只使用正常的序列化,或者在兩個進程之間使用同一臺機器,並從同一個jar文件中獲取序列化的類。如果不是這種情況,序列化爲XML是更好和更安全的選擇。
除非另有說明,否則Java庫類應具有1.4和1.6之間的兼容序列化表單。 Swing明確指出它在版本之間是不兼容的,所以如果你試圖序列化Swing對象,那麼你運氣不好。
您可能遇到由javac生成的代碼略有不同的問題。這將改變serialVersionUID
。您應該確保您在所有可串行化的類中明確聲明瞭UID。
隨着serialVersionUID
封裝結構必須保持一致的序列化,所以如果你有myjar.mypackage.myclass
在1.4你必須在myjar.mypackage.myclass
在1.6。
將Java版本或發行版本放在軟件包結構中的某處並不罕見。即使編譯時serialVersionUID保持不變,包結構也會導致在運行時拋出不兼容的版本異常。
順便說一句,如果你在你的類中實現了Serializable
,如果缺少serialVersionUID
,你應該得到一個編譯器警告。在我看來(並且基於一些相當痛苦的經驗),Java本地序列化充滿了問題,如果可能的話應該避免,尤其是有優秀的XML/JSON支持。如果您必須本地序列化,那麼我建議您將類隱藏在接口後面,並在後臺實現工廠模式,以便在需要時創建合適類的對象。
您還可以使用此抽象檢測不兼容的版本異常,並在對象中遷移數據時進行任何必要的轉換。
如果雙方使用相同的jar文件,它將在大多數時間工作。但是,如果您使用相同包/模塊/框架的不同版本(例如不同的weblogic jar或擴展使用某些「罕見」異常),需要進行大量的集成測試才能獲得批准。
不,不同版本的JVM不會破壞序列化本身。
如果您正在序列化的某些對象來自Java運行時,並且它們的類已經不兼容地發展,您將看到失敗。大多數核心Java類都很注意這一點,但過去在某些軟件包中存在不連續性。
我已經成功地在不同的機器上使用不同版本的Java運行時多年不同版本的序列化(在RMI的上下文中)。
我不想離開原來的問題太遠,但我想指出,不管格式如何,發展序列化類總是需要謹慎。這不是Java序列化特有的問題。無論是使用XML,JSON,ASN.1等進行序列化,您都必須處理相同的概念.Java序列化對允許的更改以及如何進行更改提供了一個相當明確的規範。有時這是限制性的,其他時候有一個處方是有幫助的。
- 1. 從Java 1.4轉換爲Java 1.6
- 2. 在Java性能從1.4到1.6
- 3. List.sort()NoSuchMethodException 1.6 vs 1.8
- 4. StackOverflowError 1.5 vs 1.6
- 5. Axis 1.4無法反序列化響應
- 6. 使用XStream反序列化XML在OSGi(Java 1.4)中不起作用
- 7. Java序列化
- 8. Java序列化
- 9. Java序列化
- 10. Linq to SQL vs序列化
- 11. 如何防止使用1.5/1.6特定API的Java 1.4項目?
- 12. Jquery兼容性問題1.4 - 1.6
- 13. 爲什麼.netstandard 1.4是NetStandard.Library 1.6?
- 14. Django的1.4〜1.6轉換了兼容性
- 15. hashmap 1.4和1.6之間的區別
- 16. 序列化jdk 1.5中的對象並反序列化它jdk 1.6
- 17. php 5.4序列化vs行列
- 18. 序列化HashTable,Java
- 19. 在Java序列化
- 20. 的Java序列化
- 21. Java Nio.FloatBuffer序列化
- 22. 的Java序列化
- 23. Java BufferedImage序列化
- 24. 序列化VS非序列化類的屬性
- 25. Java版本1.6加載共享庫的UnsatisfiedLinkError,Java 1.4正常工作?
- 26. 從jQuery 1.3.2升級到1.4排序序列化停止工作
- 27. Java:序列化/反序列化到XML /而不是二進制
- 28. 序列化/反序列化大對象單次Vs多次序列化/反序列化小對象?
- 29. 爲Java 1.4編寫XML序列化API的最佳對象是什麼?
- 30. VAR VS此VS $範圍在AngularJS(1.4)
我是否唯一一個從不相信序列化機制的人在跨語言/跨平臺/交叉類時可能會隨時間而改變? 如果性能不重要,我傾向於序列化爲XML並返回... – Uri 2008-11-25 20:33:23
@Uni,通常我只會在進程之間使用序列化,如果兩個進程都從同一個jar中獲取序列化類,例如兩者都進程在同一臺機器上。如果這些進程在不同的機器上,我會選擇XML。 – 2008-11-25 20:49:10