我正在查看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()));
}