ArrayListMultiMap
インターフェイスを実装するこの API を見ていSerializable
ます。これは、このオブジェクトをシリアル化できるということですか? すべての Multimap オブジェクトはシリアル化されていますか?
2 に答える
の意味Serializable
は常に同じです。オブジェクトがシリアライズ可能でない場合、シリアライズすることはできません。もしそうなら、それはうまくいくかもしれません.
ArrayList<String>
例としてArrayList.class
、リストの各メンバーがシリアライズ可能であるため、確実にシリアライズできます。シリアル化しようとしている OTOHは機能する場合とArrayList<Object>
機能しない場合があります。含まれているすべてのオブジェクトが文字列などの場合、機能します。いずれかのメンバーがシリアライズ可能でない場合、例外が発生します。
このオブジェクトをシリアル化できるということですか?
すべてのキーと値がシリアライズ可能であれば、可能です。
すべての multiMap オブジェクトはシリアライズ可能ですか?
いいえ、インターフェイスMultimap
は拡張Serializable
されないため、シリアル化できない実装が存在する可能性があります。実際、そのようなインスタンスは、例を介して取得できますMultimaps.filterEntries
。
ArrayListMultimap
とHashMultimap
はありますがSerializable
、Collection
ビュー(asMap()
たとえば)はそうではありません。
この問題はここで答えられます:
によって返されたマップを使用するにはasMap()
、新しいマップを再作成し、マルチマップCollection
ビューを他のコレクション (たとえば 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()));
}