我有一个实现可序列化的某个POJO对象的arraylist。当我将对象写入磁盘时,我这样做:
File outputDir = context.getCacheDir();
File outputFile = new File(outputDir, getCacheKey() );
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
oos.writeObject(arraylistOfMyObjects);
oos.close();
当我后来想把这个列表读回到对象的arraylist中时,我这样做:
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();
我在将输入流转换为arraylist的行上经常收到异常,错误如下所示:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.io.ObjectStreamClass
为什么会出现这些错误?如何更改我的代码以解决它们?
有趣的是,每次运行应用程序时都不会出现错误,但只是出于任何奇怪的原因而不时出现错误。
答案 0 :(得分:0)
确保您每次都以相同的顺序写回和阅读对象。在我的情况下,我意识到我正在使用可选参数写入文件:
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()
= true运行我的cacheAllItems
函数,则一切正常,但如果上次运行只保存currentItem
,则readObject()
试图将一个对象读作应该首先出现的列表。