Гуава - Можно ли сериализовать Multimap?

Я смотрю на этот API ArrayListMultiMap, который реализует интерфейс Serializable. Означает ли это, что я могу сериализовать этот объект? Все ли объекты Multimap сериализованы?


person Princesh    schedule 13.12.2012    source источник


Ответы (2)


Значение Serializable всегда одинаково: если объект не сериализуем, его нельзя сериализовать. Если да, то может работать или нет... Особенно в случае коллекций (включая карты и мультикарты), это зависит от их содержания.

Например, вы наверняка можете сериализовать ArrayList<String>, поскольку ArrayList.class является сериализуемым, как и каждый член списка. OTOH, пытающийся сериализовать ArrayList<Object>, может работать или не работать: если все содержащиеся объекты, например. строки, это будет работать. Если какой-либо элемент не сериализуем, вы получите исключение.

Означает ли это, что я могу сериализовать этот объект?

Если все ключи и значения сериализуемы, вы можете.

Все ли объекты multiMap сериализуемы?

Нет, интерфейс Multimap не расширяет Serializable, поэтому может быть несериализуемая реализация. Действительно, вы можете получить такой экземпляр, например. Multimaps.filterEntries.

person maaartinus    schedule 13.12.2012
comment
Я согласен с Мартинусом. Поскольку я использую ArralyListMultiMap (который реализует Serializable), а ключ и значение в моем случае являются String, я должен иметь возможность Serialized. - person Princesh; 13.12.2012

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()));
}
person William Gorge    schedule 03.05.2017