сериализируйте/десериализуйте Java LinkedHashMap (android)

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

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

//GET THE MAP
LinkedHashMap db = new LinkedHashMap();   
db=(LinkedHashMap) getIntent().getSerializableExtra("db");

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

  db=(LinkedHashMap) getIntent().getSerializableExtra("db");

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

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

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

5
задан weakwire 23 May 2010 в 02:50
поделиться

2 ответа

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

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

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

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

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

ОБНОВЛЕНИЕ

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

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

4
ответ дан 14 December 2019 в 13:28
поделиться

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

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); 
2
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: