Я смотрю на этот API ArrayListMultiMap
a>, который реализует интерфейс Serializable
. Означает ли это, что я могу сериализовать этот объект? Все ли объекты Multimap сериализованы?
Гуава - Можно ли сериализовать Multimap?
Ответы (2)
Значение Serializable
всегда одинаково: если объект не сериализуем, его нельзя сериализовать. Если да, то может работать или нет... Особенно в случае коллекций (включая карты и мультикарты), это зависит от их содержания.
Например, вы наверняка можете сериализовать ArrayList<String>
, поскольку ArrayList.class
является сериализуемым, как и каждый член списка. OTOH, пытающийся сериализовать ArrayList<Object>
, может работать или не работать: если все содержащиеся объекты, например. строки, это будет работать. Если какой-либо элемент не сериализуем, вы получите исключение.
Означает ли это, что я могу сериализовать этот объект?
Если все ключи и значения сериализуемы, вы можете.
Все ли объекты multiMap сериализуемы?
Нет, интерфейс Multimap
не расширяет Serializable
, поэтому может быть несериализуемая реализация. Действительно, вы можете получить такой экземпляр, например. Multimaps.filterEntries
.
ArrayListMultimap
и HashMultimap
- это Serializable
, НО представления Collection
(например, в asMap()
) - нет.
На эту проблему отвечает здесь:
Чтобы использовать карту, возвращенную asMap()
, вы можете заново создать новую карту и обернуть представления Multimap Collection
в другие коллекции (например, 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()));
}