2012-12-13 24 views

回答

7

Serializable的含義總是相同的:如果對象不可序列化,則不能序列化。如果是,它可能工作與否......特別是在集合(包括地圖和multimaps)的情況下,這取決於他們的內容。

作爲一個例子,你可以肯定地序列化ArrayList<String>,因爲ArrayList.class是可序列化的,列表的每個成員也是如此。試圖序列化ArrayList<Object>的OTOH可能工作也可能不工作:如果所有包含的對象都是例如字符串,它會工作。如果任何成員不是可序列化的,你將會得到一個異常。

這是否意味着我可以序列化這個對象?

如果所有鍵和值都是可序列化的,那麼可以。

是否所有multiMap對象都可序列化?

不,接口Multimap沒有擴展Serializable,所以可能會有不可序列化的實現。事實上,你可以通過例如Multimaps.filterEntries

+0

我阿格雷e與maartinus。因爲我使用ArralyListMultiMap(它實現了Serializable),在我的情況下鍵和值是字符串,我應該能夠序列化。 – Princesh

0

ArrayListMultimapHashMultimapSerializableCollection次(在asMap()例如)不是。

這個問題回答here

要使用由asMap()返回的地圖,你可以重新創建一個新的地圖和包裹Multimap之Collection意見納入其他收藏品(例如Set),這將使新地圖Serializable

Multimap<MyClass, MyOtherClass> myMultiMap = HashMultimap.create(); 
// ... build your multimap 
Map<MyClass, Set<MyOtherClass>> map = myMultiMap.asMap().entrySet() 
    .stream() 
    .collect(Collectors.toMap( 
     Map.Entry::getKey, 
     (entry) -> ImmutableSet.copyOf(entry.getValue()) 
    )); 

或Java 7兼容的代碼:

Multimap<MyClass, MyOtherClass> myMultiMap = HashMultimap.create(); 
// ... build your multimap 
Map<MyClass, Set<MyOtherClass>> map = Maps.newHashMap(); 
for (Map.Entry<MyClass, Collection<MyOtherClass>> entry : 
myMultiMap.asMap().entrySet()) { 
    map.put(entry.getKey(), ImmutableSet.copyOf(entry.getValue())); 
}