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 и т. Д.

Другие вопросы по тегам