Unmarshalling Bundle parsel в другом устройстве
Я должен поместить некоторую информацию в пакет. Тогда я использую parsel
и сохранение в SQlite
в кляксе
ByteArrayOutputStream valueStream = new ByteArrayOutputStream();
try {
ContentValues rows = new ContentValues();
rows.put("name", name);
Parcel p = Parcel.obtain();
bundle.writeToParcel(p, 0);
valueStream.write(p.marshall());
rows.put("bundle", valueStream.toByteArray());
db.insert("tableName", null, rows);
valueStream.close();
} catch (IOException e) {
Log.e("error writing object", e.toString());
}
Затем в другой деятельности я читаю комплект:
byte[] byteArray = cursor.getBlob(cursor.getColumnIndex(Base.BUNDLE));
Parcel parcel = Parcel.obtain();
parcel.unmarshall(byteArray, 0, byteArray.length);
parcel.setDataPosition(0);
Bundle bundle = Bundle.CREATOR.createFromParcel(parcel);
desc.setText(bundle.getCharSequence("key"));
На том же устройстве работа работает хорошо, но если я возьму файл БД и перенесу его на другое устройство, у меня будет ошибка при чтении кода:
desc.setText(bundle.getCharSequence("key"));
Неустранимый код неизвестного типа 7340147 по смещению 12
кто-нибудь может рассказать мне об этом?
2 ответа
Parcel
класс использует различные native
методы манипулирования данными, которые в этом случае используются для хранения.native
в основном значит использовать c/c++
которая в данном случае зависит от платформы и архитектуры и которая не оптимизирована для обеспечения структуры хранения для различных платформ, но оптимизирована для эффективного хранения данных на локальном оборудовании, которое в данном случае является вашим текущим устройством. ссылка на документы
Таким образом, ваши данные о хранении посылок могут работать или не работать на других устройствах, поэтому, если вы хотите согласованности, альтернативы Serializable
интерфейс или Json
объект.
Тогда я разбираюсь с этим и сохраняю в SQlite в блобе.
Это вряд ли будет работать на одном устройстве, не говоря уже о более чем одном.
Цитирование документации дляParcel
с добавлением акцента:
Посылка не является универсальным механизмом сериализации. Этот класс (и соответствующий API Parcelable для размещения произвольных объектов в Parcel) разработан как высокопроизводительный транспорт IPC. Таким образом, неуместно помещать какие-либо данные об участках в постоянное хранилище: изменения в базовой реализации любых данных в участке могут сделать более старые данные нечитаемыми.
Используйте какой-то другой механизм сериализации, который вы контролируете и можете обеспечить работу на нескольких устройствах и версиях ОС: JSON, XML, protobuf и т. Д.