2014-09-29 159 views
0

如果我用Java版本序列化一個Map(或List),會發生什麼情況,並且我試圖用serialVersionUID更改的其他java版本反序列化它?我想它會失敗。Java Map/List序列化/反序列化與不同的Java版本?

如果你爲別人創建一個lib,使用什麼樣的序列化對象的首選方式,使用Java對象如Map,List或使用自制對象的數組?

例如 List<MyObject>MyObject[]Map<String, MyObject>MyObject2[](MyObject2包含密鑰和MyObject)?

+1

如果您撰寫的類,您可以控制'serialVersionUID'領域。這不會因爲人們使用不同的Java版本而改變。你是否將這些概念混淆在一起? – 2014-09-29 08:30:36

+1

是的,我創建MyObject類,爲此我可以控制serialVersionUID,但我無法控制List或Map的serialVersionUID,所以我想知道是不是更好地使用我的自定義對象而不是使用List或Map? – telebog 2014-09-29 08:41:59

+0

由於JDK的Map *實現的serialVersionUID在內存中沒有發生變化,因此查看這個問題的實際內容是diffixult。 – EJP 2014-09-29 10:23:25

回答

1

是的,你是正確的,改變serialVersionUID的反序列化將失敗。 JDK的版本並不重要。

如果你爲別人創造一個lib用什麼將是序列化對象的首選方式 ,使用Java對象,如地圖,列表或使用 陣列自制的對象?

您可以將對象序列化爲一些更便攜的格式,如使用純文本(例如JSON,XML)。你可以看看JAXBXStream

但請記住,序列化的主要用途是通過網絡傳輸對象。如果你想存儲一些狀態,你通常應該使用一個數據庫。序列化爲字節主要用於短期對象(因爲如您注意到的,對象可能會更改,因此serializationVersionId也可能會更改)。

希望它有幫助。

0

如果您控制該類,並且未更改serialVersionUID,則也可以從舊版本對類的實例進行反序列化。那裏的java提供了一個被稱爲二進制兼容性的概念。大多數的二進制兼容性的靈活性來自於使用了類,接口,字段的名稱符號引用,方法的後期綁定的:

http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html

所以核心類從Java例如即使該類將涉及未來版本的Java,HashMap,ArrayList,Vector ...也將被反序列化。

如果您希望在您自己的類中控制版本控制,只需手動提供serialVersionUID字段並確保它始終保持不變,而不管您對類文件所做的更改如何。

請參見這篇文章: http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html