ImmutableMap превращается в хэш-карту при передаче через Intent
-
21-12-2019 - |
Вопрос
Я использую коллекции Guava в проекте Android.Только что заметил следующее поведение:
В 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.Исключение ClassCastException:java.util.Хэш-карта не может быть приведена к com.google.common.collect.Неизменяемая карта
Итак, в какой-то момент ImmutableMap
превращается в HashMap
.Интересно, почему это так и что я могу сделать, чтобы избежать этого?
ПОСТСКРИПТУМ.Если я напечатаю это для отладки выходных данных сразу после создания/получения намерения:
intent.getSerializableExtra("extra1").getClass().getSimpleName());
// ^^^^ prints SingletonImmutableBiMap in Activity1
// ^^^^ prints HashMap in Activity2
Решение
То Intent
дополнительные услуги передаются по кругу в виде посылки, который представляет собой высокопроизводительный IPC-транспорт (подумайте о высокопроизводительной сериализации).При разделении ваша неизменяемая карта будет написано так же, как и все реализации Map, и , таким образом , это позже читается как хэш-карта.
Я не думаю, что вы сможете избежать этого.Если вы действительно хотите работать с ImmutableMap
, вам нужно было бы использовать ImmutableMap.copyOf()
чтобы скопировать содержимое хэш-карты в неизменяемую карту.
Activity2::onCreate(...) {
ImmutableMap<String,String> map = ImmutableMap.copyOf(
(Map<String,String>)getIntent().getSerializableExtra("extra1")
);
}