我经常使用java序列化,这是非常有用的存储一个完整的对象层次结构。番石榴SetMultimap不可序列化(由于不可序列化WrappedSet)
当试图序列化一个SetMultimap时,我得到一个异常,说AbstractMultimap.WrappedSet是不可序列化的。
番石榴用户如何解决这个问题?
由于提前,
我经常使用java序列化,这是非常有用的存储一个完整的对象层次结构。番石榴SetMultimap不可序列化(由于不可序列化WrappedSet)
当试图序列化一个SetMultimap时,我得到一个异常,说AbstractMultimap.WrappedSet是不可序列化的。
番石榴用户如何解决这个问题?
由于提前,
多重映射的元素的视图(如集合从get
方法中,asMap
视图等返回)是有意地不序列化的。但是,由于这个原因,SetMultimap
实现不可序列化。 Guava提供的SetMultimap
的所有实现实际上都是可序列化的......它只是它们的局部视图集合,而不是。
Set<Foo> foo = Sets.newHashSet(multimap.get(someKey));
编辑所以在看的AbstractMultimap
源,返回的Map
是AsMap
或SortedAsMap
,这两者都不是序列化的。我建议创建一个新的HashMap
并使用Multimap.asMap()
结果中的putAll
方法。 HashMap
是可序列化的。
HashMap myMap = new HashMap();
myMap.putAll(myMultimap.asMap());
事实上的putAll(...)复制内容转换成由多重映射自身创建的集:
如果您需要序列化这些收藏品之一,你应该明确地将其复制到一个正常的集合。而且,无论使用什么Set实现,它总是被包装成一个WrappedCollection,它是不可序列化的。因为不幸的是HashMultimap是最终的,所以我不能重写它,所以我开始复制代码HashMultimap来修改它,但WrappedCollection有一些引用无法到达的私有变量...所以我只是在http中添加了增强查询://code.google.com/p/guava-libraries/issues/detail?id = 615 – Martin
我没有说'HashMultimap',而是'HashMap'。 –
您的HashMap中的值将是由multimap创建的集合,它们是不可序列化的。 –
很可能我的对象树保留了应该复制的视图之一的引用。感谢提示! – Martin