2011-12-13 52 views

回答

7

多重映射的元素的视图(如集合从get方法中,asMap视图等返回)是有意地不序列化的。但是,由于这个原因,SetMultimap实现不可序列化。 Guava提供的SetMultimap的所有实现实际上都是可序列化的......它只是它们的局部视图集合,而不是。

Set<Foo> foo = Sets.newHashSet(multimap.get(someKey)); 
+0

很可能我的对象树保留了应该复制的视图之一的引用。感谢提示! – Martin

0

编辑所以在看的AbstractMultimap源,返回的MapAsMapSortedAsMap,这两者都不是序列化的。我建议创建一个新的HashMap并使用Multimap.asMap()结果中的putAll方法。 HashMap是可序列化的。

HashMap myMap = new HashMap(); 
myMap.putAll(myMultimap.asMap()); 
+0

事实上的putAll(...)复制内容转换成由多重映射自身创建的集:

如果您需要序列化这些收藏品之一,你应该明确地将其复制到一个正常的集合。而且,无论使用什么Set实现,它总是被包装成一个WrappedCollection,它是不可序列化的。因为不幸的是HashMultimap是最终的,所以我不能重写它,所以我开始复制代码HashMultimap来修改它,但WrappedCollection有一些引用无法到达的私有变量...所以我只是在http中添加了增强查询://code.google.com/p/guava-libraries/issues/detail?id = 615 – Martin

+0

我没有说'HashMultimap',而是'HashMap'。 –

+0

您的HashMap中的值将是由multimap创建的集合,它们是不可序列化的。 –

相关问题