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()));
}