有很多收藏品不是Serializable
。一些特別討厭的是上的keySet
和values
集合(參見該討論的JDK bug 4756277和4501848)。是SerializableWrappers收集一個壞主意?
如果我需要序列化這些集合中的一個,則建議的一個解決方法是在另一個集合中實施Serializable
,然後發送它。例如:
Set<T> realSet = myHashMap.keySet();
Set<T> toSerialize = new HashSet<T>(realSet);
我不喜歡這樣的開銷,尤其是當考慮到序列化操作的實現通常是爲寫出的大小,並通過一系列迭代一次一樣簡單。
這使我想到了一個可序列化的包裝類,它實現了這個簡單的序列化表單,並且只有synchronizedSet
和朋友的精神,對代表只有一個臨時引用。就像這樣,實現僅取決於size()
和iterator
,並且使用readResolve
進行反序列化以給出HashSet
,比方說。
這感覺有點髒。真正的漏洞在哪裏?
- 不能處理基於等價關係到的
HashSet
(TreeSet
,IdentityHashMap
等)的集合。我看不出這個問題太重要了,我們只是沒有在這些類型的集合中指定結果,正如其他地方所見。 - 有沒有關於版本uid的序列化陷阱,會阻止這個工作?關於嘗試它...
- 當反序列化時,這不會遵守
HashMap#keySet()
的規範,因爲它不是映射的實時視圖。是否可以指定它是序列化時映射的靜態視圖?
當你必須序列化Map和keySet的引用時,真正的問題出現了。複製keySet顯然不會使兩個集合保持同步。 – cquezel 2013-11-14 02:41:14