2011-12-13 5 views

답변

7

보기은 (get 컬렉션이 방법은 asMap 관점 등으로부터 반환 된 바와 같은)은 의도적으로 직렬화 아니다. 그러나 SetMultimap 구현은 그 때문에 직렬화 할 수 없다는 것은 사실이 아닙니다. Guava가 제공하는 SetMultimap의 모든 구현은 사실 직렬화 가능합니다 ... 그렇지 않은 부분 뷰 컬렉션 일뿐입니다. 당신이 이러한 컬렉션 중 하나를 직렬화해야하는 경우

, 당신은 명시 적으로 보통 징수에 복사해야합니다

Set<Foo> foo = Sets.newHashSet(multimap.get(someKey)); 
+0

아마도 대부분 내 개체 트리가 복사해야하는 뷰 중 하나에 대한 참조를 유지하고있을 것입니다. 힌트를 가져 주셔서 감사합니다! – Martin

0

편집 그래서 반환되는 Map가 직렬화되어 어느 쪽도 아니의 AsMap 또는 SortedAsMap이며, AbstractMultimap의 소스를 찾고 있습니다. 새 HashMap을 만들고 putAll 메서드를 사용하여 Multimap.asMap() 결과를 전달하는 것이 좋습니다. HashMap은 직렬화 가능합니다. multimap은 요소의

HashMap myMap = new HashMap(); 
myMap.putAll(myMultimap.asMap()); 
+0

사실 putAll에 (...) 복사 내용을 multimap은 그 자체로 만든 세트로. 더욱이 Set 구현이 사용 되더라도 항상 직렬화가 불가능한 WrappedCollection으로 래핑됩니다. 안타깝게도 HashMultimap은 최종 버전이기 때문에 재정의 할 수 없으므로 코드 HashMultimap을 복사하여 복사하기 시작했지만 WrappedCollection에는 접근 할 수없는 private var에 대한 참조가 있습니다. 그래서 http로 확장 쿼리를 추가했습니다. : //code.google.com/p/guava-libraries/issues/detail? id = 615 – Martin

+0

'HashMultimap'이 아니라 HashMap입니다. –

+0

HashMap의 값은, 직렬화 가능하지 않은, 멀티 맵에 의해 작성된 세트가됩니다. –

관련 문제