Android:读取arraylist时ObjectInputStream抛出ClassCastException

Posted

技术标签:

【中文标题】Android:读取arraylist时ObjectInputStream抛出ClassCastException【英文标题】:Android: ObjectInputStream throws ClassCastException when reading arraylist 【发布时间】:2015-07-07 05:57:15 【问题描述】:

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

我在将输入流转换为 arraylist 的行上经常收到异常,错误如下所示:

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

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

有趣的是,这个错误并不是每次我运行应用程序时都会出现,而是时不时出现,无论出于什么奇怪的原因。

【问题讨论】:

myObject 几乎完全由基本类型(整数、字符串等)组成,但它所拥有的少数对象也都实现了可序列化。我已经仔细检查了 如果我站在你的立场上,我会尝试两种不同的情况:1. 尝试将 myObject 更改为基本类类型,如整数并发送数组 2. 尝试发送一个 MyObject 而不是数组 之后你可以看到异常在哪里。 【参考方案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();

因此,如果我上次使用 cacheAllItems = true 运行我的 cacheItems() 函数,一切正常,但如果它上次运行只是保存 currentItemreadObject() 试图读取一个对象作为应该放在第一位的列表。

【讨论】:

以上是关于Android:读取arraylist时ObjectInputStream抛出ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上跨会话从文件中写入然后读取 ArrayList<Object>?

所有异步任务可以同时读取一个 ArrayList 没有任何延迟

在读取打印条件时打印 ArrayList

jmeter ---json几种读取方式,ArrayList循环读取

Java 数组ArrayList语法

高级数组-ArrayList