我正在查看ArrayListMultiMap实现该Serializable接口的 API。这是否意味着我可以序列化这个对象?是否所有 Multimap 对象都已序列化?
2 回答
的含义Serializable始终相同:如果对象不可序列化,则无法序列化。如果是,它可能工作或不工作......特别是在集合(包括地图和多地图)的情况下,这取决于它们的内容。
例如,您当然可以ArrayList<String>按可序列化的ArrayList.class方式进行序列化,列表中的每个成员也是如此。OTOH 尝试序列化ArrayList<Object>可能会或可能不会起作用:如果所有包含的对象都是字符串,它会起作用。如果任何成员不可序列化,您将收到异常。
这是否意味着我可以序列化这个对象?
如果所有键和值都是可序列化的,则可以。
所有 multiMap 对象都是可序列化的吗?
不,接口Multimap不扩展Serializable,因此可能存在不可序列化的实现。事实上,您可以通过 eg 获得这样的实例Multimaps.filterEntries。
ArrayListMultimap并且HashMultimap是Serializable但是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()));
}