저는 종종 완전한 직렬화를 저장하는 데 매우 유용한 Java 직렬화를 사용합니다.Guava SetMultimap이 직렬화 가능하지 않음 (직렬화 가능 WrappedSet이 아니기 때문에)
SetMultimap을 직렬화하려고 할 때 예외적 인 의미가 있습니다. AbstractMultimap.WrappedSet은 직렬화 할 수 없습니다.
구아바 사용자가이 문제로 어떻게 해결할 수 있습니까? 사전에
감사합니다,
저는 종종 완전한 직렬화를 저장하는 데 매우 유용한 Java 직렬화를 사용합니다.Guava SetMultimap이 직렬화 가능하지 않음 (직렬화 가능 WrappedSet이 아니기 때문에)
SetMultimap을 직렬화하려고 할 때 예외적 인 의미가 있습니다. AbstractMultimap.WrappedSet은 직렬화 할 수 없습니다.
구아바 사용자가이 문제로 어떻게 해결할 수 있습니까? 사전에
감사합니다,
보기은 (get
컬렉션이 방법은 asMap
관점 등으로부터 반환 된 바와 같은)은 의도적으로 직렬화 아니다. 그러나 SetMultimap
구현은 그 때문에 직렬화 할 수 없다는 것은 사실이 아닙니다. Guava가 제공하는 SetMultimap
의 모든 구현은 사실 직렬화 가능합니다 ... 그렇지 않은 부분 뷰 컬렉션 일뿐입니다. 당신이 이러한 컬렉션 중 하나를 직렬화해야하는 경우
, 당신은 명시 적으로 보통 징수에 복사해야합니다
Set<Foo> foo = Sets.newHashSet(multimap.get(someKey));
편집 그래서 반환되는 Map
가 직렬화되어 어느 쪽도 아니의 AsMap
또는 SortedAsMap
이며, AbstractMultimap
의 소스를 찾고 있습니다. 새 HashMap
을 만들고 putAll
메서드를 사용하여 Multimap.asMap()
결과를 전달하는 것이 좋습니다. HashMap
은 직렬화 가능합니다. multimap은 요소의
HashMap myMap = new HashMap();
myMap.putAll(myMultimap.asMap());
사실 putAll에 (...) 복사 내용을 multimap은 그 자체로 만든 세트로. 더욱이 Set 구현이 사용 되더라도 항상 직렬화가 불가능한 WrappedCollection으로 래핑됩니다. 안타깝게도 HashMultimap은 최종 버전이기 때문에 재정의 할 수 없으므로 코드 HashMultimap을 복사하여 복사하기 시작했지만 WrappedCollection에는 접근 할 수없는 private var에 대한 참조가 있습니다. 그래서 http로 확장 쿼리를 추가했습니다. : //code.google.com/p/guava-libraries/issues/detail? id = 615 – Martin
'HashMultimap'이 아니라 HashMap입니다. –
HashMap의 값은, 직렬화 가능하지 않은, 멀티 맵에 의해 작성된 세트가됩니다. –
아마도 대부분 내 개체 트리가 복사해야하는 뷰 중 하나에 대한 참조를 유지하고있을 것입니다. 힌트를 가져 주셔서 감사합니다! – Martin