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()
函数,一切正常,但如果它上次运行只是保存 currentItem
,readObject()
试图读取一个对象作为应该放在第一位的列表。
【讨论】:
以上是关于Android:读取arraylist时ObjectInputStream抛出ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上跨会话从文件中写入然后读取 ArrayList<Object>?
所有异步任务可以同时读取一个 ArrayList 没有任何延迟