Сериализация / десериализация Java LinkedHashMap (Android) - PullRequest
5 голосов
/ 23 мая 2010

Итак, я хочу передать LinkedHashMap намерению.

//SEND THE MAP
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class);
singlechannel.putExtra("db",shows1);//perase to
startActivity(singlechannel);

//GET THE MAP
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>();   
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

Этот сработал как шарм с HashMap. Но с LinkedHashMap у меня возникла проблема, я получил ошибку во время выполнения здесь

  db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

Я не получаю ошибку с HashMap.

Я также получил предупреждение «Безопасность типов: непроверенное приведение из Serializable к LinkedHashMap» Но у меня было это предупреждение с HashMap тоже. Любые идеи. Любая помощь высоко ценится

Также я только что видел это. https://issues.apache.org/jira/browse/HARMONY-6498

Ответы [ 2 ]

4 голосов
/ 23 мая 2010

Корень проблемы здесь в том, что вы пытаетесь набрать приведение к универсальному типу. Это не может быть сделано без небезопасного / непроверенного приведения типа.

Типы выполнения универсальных типов являются необработанными типами; то есть типы, в которых фактические типы параметров типа неизвестны. В этом случае тип времени выполнения будет LinkedHashMap<?, ?>. Это не может быть безопасно приведено к типу LinkedMashMap<String, String>, поскольку во время выполнения система не может знать, что все ключи и значения на самом деле являются String экземплярами.

У вас есть два варианта:

  • Вы можете добавить аннотацию, чтобы сказать компилятору «заткнуться» о непроверенном приведении. Это немного рискованно. Если по какой-либо причине один из ключей или значений на самом деле не является строкой, ваше приложение может позже получить ClassCastException в совершенно неожиданном месте; например во время итерации клавиш или присвоения результата get.

  • Вы можете вручную скопировать десериализованный Map<?, ?> в новый LinkedMashMap<String, String>, явно приведя каждый ключ и значение к String.

UPDATE

Очевидно, что истинная причина исключения времени выполнения (в отличие от ошибки компиляции «unsafe typecast») заключается в том, что Android передает serializedExtra между намерениями как обычный HashMap, а не использует класс Map, который вы предоставлена. Это описано здесь:

Как объясняют эти вопросы и ответы, простого обходного пути нет. Если вы хотите передать карту, сохраняющую порядок ключей, придется преобразовать карту в массив пар и передать ее. С другой стороны, вам нужно будет восстановить карту из переданного массива.

2 голосов
/ 23 мая 2010

LinkedHashMap реализует интерфейс Map, вот определение из исходного кода:

public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>

Следующий тест работает нормально, поэтому я думаю, что у вас проблема не связана LinkedHashMap.

Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("1", "one");
        FileOutputStream fos = new FileOutputStream("c://map.ser");
        ObjectOutputStream out = new ObjectOutputStream(fos);
        out.writeObject(map);
        out.close();


        FileInputStream fin = new FileInputStream("c://map.ser");
        ObjectInputStream in = new ObjectInputStream(fin);
        Map<String, String> map2 = (Map<String, String>) in.readObject();
        System.out.println(map2); 
...