문제

Android 프로젝트에서 Guava 컬렉션을 사용하고 있습니다.방금 다음 동작을 확인했습니다.

~ 안에 Activity1:

Intent i = new Intent(this, Activity2.class);
i.putExtra("extra1", ImmutableMap.of("key1", "value1"));
startActivity(i);

~ 안에 Activity2:

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = 
         (ImmutableMap<String,String>)getIntent()
              .getSerializableExtra("extra1");
  // above line throws ClassCastException!
}

실행되면 두 번째 코드 조각의 코드에서 다음 예외가 발생합니다.

java.lang.ClassCast예외:java.util.HashMap 을 캐스트 할 수 없습니다. com.google.common.collect.ImmutableMap

그래서 어느 순간 ImmutableMap 로 변하게 된다 HashMap.왜 그런 것인지, 이를 방지하려면 어떻게 해야 하는지 궁금합니다.

추신인텐트를 구성/수신한 직후에 출력을 디버그하기 위해 이것을 인쇄하는 경우:

intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
도움이 되었습니까?

해결책

그만큼 Intent 엑스트라는 다음과 같이 전달됩니다. 소포, 이는 고성능 IPC 전송입니다(고성능 직렬화를 생각해 보세요).소포화되면 ImmutableMap은 다음과 같습니다. 모든 Map 구현처럼 작성됨, 그래서 나중에 HashMap으로 읽기.

나는 당신이 이것을 피할 수 없다고 생각합니다.정말로 함께 일하고 싶다면 ImmutableMap, 당신은 사용해야합니다 ImmutableMap.copyOf() HashMap의 콘텐츠를 ImmutableMap에 복사합니다.

Activity2::onCreate(...) {
  ImmutableMap<String,String> map = ImmutableMap.copyOf(
         (Map<String,String>)getIntent().getSerializableExtra("extra1")
  );
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top