将Guava的ArrayListMultimap转换为Serializable Map

时间:2016-02-25 12:01:19

标签: java serialization guava

转换ArrayListMultimap Serializable中的Map是否可行?当然键和值是Serializable。

我知道ArrayListMultimap是可序列化的,但我想将其序列化为普通Map,因为我不希望解串器必须知道guava Multimaps。

我试过这个:

    ArrayListMultimap<String, Integer> mmap = ArrayListMultimap.create();
    mmap.put("key",1);
    mmap.put("key",222222222);

    ObjectOutput out = new ObjectOutputStream(new ByteArrayOutputStream());
    //This works fine
    out.writeObject(mmap);
    Map<String, List<Integer>> map = Multimaps.asMap(mmap);
    try {
        out.writeObject(map);
    } catch (NotSerializableException e){
        //Multimaps.asMap is not Serializable, seems reasonable to me
    }

    ImmutableMap<String, List<Integer>> imap = ImmutableMap.copyOf(map);
    //Will throw java.io.NotSerializableException: com.google.common.collect.AbstractMapBasedMultimap$RandomAccessWrappedList. Oh man!! why!??
    out.writeObject(imap);

然后,有没有办法(一种有效的方式)转换序列化地图中的ArrayListMultimap,这是:一个带有可序列化列表的地图?

我正在使用guava-18.0

1 个答案:

答案 0 :(得分:1)

您可以使用http://psoug.org/reference/synonyms.html将地图值转换为Serializable列表:

imap = ImmutableMap.copyOf(Maps.transformValues(map, ImmutableList::copyOf));