Чтение и запись ArrayList<Object> с различными типами объектов в посылке
Я использую посылку для кэширования предметов в двоичном файле. Все было хорошо, пока мне нужно хранить в сингле ArrayList
различные типы объектов:
fout = new FileOutputStream(file);
Parcel parcel = Parcel.obtain();
ArrayList<Object> list = new ArrayList<Object>(items);
Log.d(TAG, "write items to cache: " + items.size());
parcel.writeList(list);
byte[] data = parcel.marshall();
fout.write(data);
Но чтение не работает должным образом:
fin = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fin.read(data);
Log.d(TAG, "file size: " + file.length());
Parcel parcel = Parcel.obtain();
parcel.unmarshall(data, 0, data.length);
ArrayList<Object> rawList = parcel.readArrayList(Object.class.getClassLoader());
Я думаю, что проблема в объекте classLoader, который не может создать объект для расширенного класса.
Есть идеи, как я могу это легко исправить? Или, может быть, кто-то может дать мне совет для моей задачи, которая заключается в кэшировании ArrayList
или установить в файл с объектами типа <? extends Object?>
, Logcat:
08-20 12:16:52.200: D/ItemList(6637): writing data
08-20 12:16:52.200: D/ItemList(6637): write items to cache: 2
08-20 12:17:45.940: D/ItemList(6925): reading data
08-20 12:17:46.650: D/ItemList(6925): reading data
08-20 12:17:47.050: D/ItemList(6925): reading data
08-20 12:17:47.060: D/ItemList(6925): cache file found
08-20 12:31:18.050: D/ItemList(7349): file size: 760
08-20 12:17:47.060: D/ItemList(6925): founded items in cache: 0
Больше logcat:
08-20 12:49:02.930: D/ItemList(9241): file size: 1136
08-20 12:49:02.930: D/ItemList(9241): dataAvail(): 0
08-20 12:49:02.930: D/ItemList(9241): dataSize(): 1136
08-20 12:49:02.930: D/ItemList(9241): dataCapacity(): 1136
08-20 12:49:02.930: D/ItemList(9241): founded items in cache: 0
1 ответ
Решение
ОК, я нашел это. Вы никогда не читаете данные из файла:
fin = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
Все, что вам нужно сделать, это создать входной поток и выделить буфер байтов.
РЕДАКТИРОВАТЬ Добавить еще код о том, как разобрать посылку
Parcel parcel = Parcel.obtain();
parcel.unmarshall(data, 0, data.length);
parcel.setDataPosition(0); // Set the position in the parcel back to the beginning
// so that we can read the stuff out of it
ArrayList<Object> rawList = parcel.readArrayList(Object.class.getClassLoader());