Android:ObjectInputStream在读取arraylist时抛出ClassCastException

问题描述 投票:1回答:1

我有一个实现可序列化的某个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

为什么会出现这些错误?如何更改我的代码以解决它们?

有趣的是,每次运行应用程序时都不会出现错误,但只是出现任何奇怪的原因。

android arraylist classcastexception objectinputstream
1个回答
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函数,一切正常,但如果它最后一次运行只是保存currentItemreadObject()试图读取一个对象作为应该首先出现的列表。

© www.soinside.com 2019 - 2024. All rights reserved.