2008-11-25 66 views
4

我有一個java程序必須編譯爲1.4,另一個程序可以是任何東西(如1.4或1.6),並且這兩個程序需要來回傳遞序列化對象。如果我在兩個程序都可以看到的地方定義一個可序列化的類,那麼java的序列化是否仍然有效,還是僅需要1.6-1.6或1.4-1.4?Java序列化1.4 vs 1.6

+0

我是否唯一一個從不相信序列化機制的人在跨語言/跨平臺/交叉類時可能會隨時間而改變? 如果性能不重要,我傾向於序列化爲XML並返回... – Uri 2008-11-25 20:33:23

+0

@Uni,通常我只會在進程之間使用序列化,如果兩個進程都從同一個jar中獲取序列化類,例如兩者都進程在同一臺機器上。如果這些進程在不同的機器上,我會選擇XML。 – 2008-11-25 20:49:10

回答

5

確保要序列化的類定義並將值賦予static final long serialVersionUID,您應該沒問題。

這就是說,通常我不會這樣做。我的首選是在一個進程中只使用正常的序列化,或者在兩個進程之間使用同一臺機器,並從同一個jar文件中獲取序列化的類。如果不是這種情況,序列化爲XML是更好和更安全的選擇。

1

除非另有說明,否則Java庫類應具有1.4和1.6之間的兼容序列化表單。 Swing明確指出它在版本之間是不兼容的,所以如果你試圖序列化Swing對象,那麼你運氣不好。

您可能遇到由javac生成的代碼略有不同的問題。這將改變serialVersionUID。您應該確保您在所有可串行化的類中明確聲明瞭UID。

3

隨着serialVersionUID封裝結構必須保持一致的序列化,所以如果你有myjar.mypackage.myclass在1.4你必須在myjar.mypackage.myclass在1.6。

將Java版本或發行版本放在軟件包結構中的某處並不罕見。即使編譯時serialVersionUID保持不變,包結構也會導致在運行時拋出不兼容的版本異常。

順便說一句,如果你在你的類中實現了Serializable,如果缺少serialVersionUID,你應該得到一個編譯器警告。在我看來(並且基於一些相當痛苦的經驗),Java本地序列化充滿了問題,如果可能的話應該避免,尤其是有優秀的XML/JSON支持。如果您必須本地序列化,那麼我建議您將類隱藏在接口後面,並在後臺實現工廠模式,以便在需要時創建合適類的對象。

您還可以使用此抽象檢測不兼容的版本異常,並在對象中遷移數據時進行任何必要的轉換。

0

如果雙方使用相同的jar文件,它將在大多數時間工作。但是,如果您使用相同包/模塊/框架的不同版本(例如不同的weblogic jar或擴展使用某些「罕見」異常),需要進行大量的集成測試才能獲得批准。

1

不,不同版本的JVM不會破壞序列化本身。

如果您正在序列化的某些對象來自Java運行時,並且它們的類已經不兼容地發展,您將看到失敗。大多數核心Java類都很注意這一點,但過去在某些軟件包中存在不連續性。

我已經成功地在不同的機器上使用不同版本的Java運行時多年不同版本的序列化(在RMI的上下文中)。

我不想離開原來的問題太遠,但我想指出,不管格式如何,發展序列化類總是需要謹慎。這不是Java序列化特有的問題。無論是使用XML,JSON,ASN.1等進行序列化,您都必須處理相同的概念.Java序列化對允許的更改以及如何進行更改提供了一個相當明確的規範。有時這是限制性的,其他時候有一個處方是有幫助的。