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()
попытался прочитать один объект как список, который должен стоять первым.