【发布时间】:2014-02-12 00:24:55
【问题描述】:
我正在尝试在 Java 中保存/加载 TicketSet 类的实例。下面是类和类变量。 Ticket 和 Variable 类也是可序列化的。
public class TicketSet implements Serializable{
public final int setID;
public int ticketNum;
public Ticket[] tickets;
private static int xCount[];
private static int yCount[];
private static int zCount[];
private Variable x;
private Variable y;
private Variable z;
在另一个类中,我保存了一个 TicketSet 类的实例,它似乎工作正常。在代码中,gen 只是一个初始化 TicketSet 的控制器类的实例。
TicketSet set;
if (f.exists()) {
FileOutputStream fileOut =new FileOutputStream(f,true);
AppendingObjectOutputStream out = new AppendingObjectOutputStream(fileOut);
set = gen.getTSet();
out.writeObject(set);
out.close();
fileOut.close();
} else {
FileOutputStream fileOut =new FileOutputStream(f,true);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
set = gen.getTSet();
out.writeObject(set);
out.close();
fileOut.close();
}
要加载 TicketSet 的实例,我有以下代码会引发错误。
ArrayList<Integer> tickid = new ArrayList<Integer>();
tSets = new HashMap<Integer, TicketSet>();
FileInputStream fileStr = null;
ObjectInputStream reader = null;
try {
fileStr = new FileInputStream("TicketSets.ser");
reader = new ObjectInputStream(fileStr);
System.out.println(fileStr.available());
TicketSet tSet= null;
while (fileStr.available()>0) {
Object next = reader.readObject(); //ERROR HERE
if (next instanceof TicketSet) {
tSet = (TicketSet) next;
System.out.println("ID: "+tSet.setID);
tSets.put(tSet.setID, tSet);
tickid.add(tSet.setID);
} else {
System.out.println("Unexpected object type: " + next.getClass().getName());
}
}
//System.out.println("Size: "+tSets.size());
reader.close();
fileStr.close();
}
catch(IOException i) {
i.printStackTrace();
}
catch (ClassNotFoundException c) {
System.out.println("TicketSet class not found");
c.printStackTrace();
}
抛出的错误是:
ID: 7325825
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.io.ObjectStreamClass
所以我的理解是:
- 第一个 TicketSet 加载良好... ID=73225825
- 然后它尝试从文件中加载一个整数,而不是 TicketSet 对象。
为什么要加载整数?有没有办法跳过阅读对象以外的任何内容?我应该尝试其他方法吗?
【问题讨论】:
-
显然您的输入流不是有效的序列化对象。
-
该文件中是否有多个对象?尝试使用与
available不同的东西 - 它很可能不会达到您的预期。 -
也许在您的标签中添加 jboss? docs.jboss.org/jbossas/javadoc/4.0.3SP1/common/org/jboss/util/…
-
或者你的 AppendingObjectOutputStream 是这个 hack? stackoverflow.com/questions/1194656/…
-
@Fildor 是的,我需要它来处理多个对象
标签: java classcastexception fileinputstream fileoutputstream