6

我正在查看ArrayListMultiMap实现该Serializable接口的 API。这是否意味着我可以序列化这个对象?是否所有 Multimap 对象都已序列化?

4

2 回答 2

9

的含义Serializable始终相同:如果对象不可序列化,则无法序列化。如果是,它可能工作或不工作......特别是在集合(包括地图和多地图)的情况下,这取决于它们的内容。

例如,您当然可以ArrayList<String>按可序列化的ArrayList.class方式进行序列化,列表中的每个成员也是如此。OTOH 尝试序列化ArrayList<Object>可能会或可能不会起作用:如果所有包含的对象都是字符串,它会起作用。如果任何成员不可序列化,您将收到异常。

这是否意味着我可以序列化这个对象?

如果所有键和值都是可序列化的,则可以。

所有 multiMap 对象都是可序列化的吗?

不,接口Multimap不扩展Serializable,因此可能存在不可序列化的实现。事实上,您可以通过 eg 获得这样的实例Multimaps.filterEntries

于 2012-12-13T16:19:22.513 回答
0

ArrayListMultimap并且HashMultimapSerializable但是Collection视图(asMap()例如)不是。

这个问题在这里得到解答:

要使用返回的地图asMap(),您可以重新创建一个新地图并将 MultimapCollection视图包装到其他集合(例如 a 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()));
}
于 2017-05-03T16:21:10.140 回答