ImmutableMap превращается в хэш-карту при передаче через Intent

StackOverflow https://stackoverflow.com//questions/24038828

  •  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")
  );
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top