Android: ObjectInputStream создает исключение ClassCastException при чтении массива

У меня есть arraylist определенного объекта POJO, который реализует сериализуемый. Когда я записываю объект на диск, я делаю это так:

File outputDir = context.getCacheDir();
File outputFile = new File(outputDir,  getCacheKey() );
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
oos.writeObject(arraylistOfMyObjects);
oos.close();

и когда я позже захочу прочитать этот список в массив объектов, я сделаю это так:

File outputDir = context.getCacheDir();
File outputFile = new File(outputDir,  getCacheKey() );
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(outputFile)));
final ArrayList<myObject> list = (ArrayList<myObject>) ois.readObject();
ois.close();

Я получаю частые исключения в строке, где я передаю входной поток массиву, с ошибкой, похожей на эту:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.io.ObjectStreamClass

Почему происходят эти ошибки и как я могу изменить свой код для их устранения?

Интересно, что ошибка возникает не каждый раз, когда я запускаю приложение, а только время от времени по какой-то странной причине.

1 ответ

Убедитесь, что вы пишете и читаете ваши объекты обратно в том же порядке каждый раз. В моем случае я понял, что пишу в файл с дополнительными параметрами, такими как это:

if(cacheAllItems) { // <-- BREAKS READING FILE WHEN FALSE
   objectOutputStream.writeObject(itemsList);
   objectOutputStream.writeObject(itemNamesList);
}
objectOutputStream.writeObject(currentItem);

Затем я пытался прочитать файл с:

itemsList = (ArrayList<Item>) objectInputStream.readObject(); // MIGHT NOT EXIST
itemNames = (ArrayList<String>) objectInputStream.readObject(); // MIGHT NOT EXIST
currentItem = (Item) objectInputStream.readObject();

Так что, если бы я в последний раз запустить мой cacheItems() функция с cacheAllItems = true, все работало нормально, но если последний раз запускался, просто сохранял currentItem, readObject() попытался прочитать один объект как список, который должен стоять первым.

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