readObject()不起作用,并从方法中断

时间:2013-04-20 16:00:21

标签: java object serialization

我想从文件到ArrayList读取不同类型的对象,它们都是扩展类Advertisement的类的实例。我正在尝试使用此代码:

ArrayList <Advertisement> ads = new ArrayList<Advertisement>();
ObjectInput input2 = new ObjectInputStream(
    new BufferedInputStream(new FileInputStream("ads.ser")));

//break from this method at this point
ads = (ArrayList<Advertisement>) input2.readObject(); 

问题出在第3行/最后一行。它不会读取ads类型的变量ArrayList<Advertisement>中的对象,而且它会从此方法中断,没有任何消息。

编辑:删除了try-catch块,我应该早点完成,但我仍然不知道解决方案。 Stacktrace:

java.io.InvalidClassException: Kiado; local class incompatible: stream classdesc serialVersionUID = -1393576200767336208, local class serialVersionUID = -841663850423605586
    at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at java.util.ArrayList.readObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Main.beolvasas(Main.java:30)
    at Main.startup(Main.java:57)
    at Main.main(Main.java:633)

2 个答案:

答案 0 :(得分:0)

你有任何代码:

catch(<WheteverException> e)
{
   // nothing here
}

若是,请执行以下操作:

  1. // nothing here更改为e.printStackTrace();
  2. 删除try / catch,只在编译器告诉你时才将其添加回来,然后只添加编译器要求你添加的异常(例如不要catch(Exception e)

答案 1 :(得分:0)

现在您有了堆栈跟踪,问题很明显:从您将对象序列化到文件的那一刻起,您就已经对类Kiado进行了更改。因此,您现在拥有的类与该类不兼容,就像将对象序列化到文件时一样。

如果您没有更改类(及其所有超类)字段的数量和名称,只需在类中添加以下变量声明即可再次兼容:

private static final long serialVersionUID = -1393576200767336208;

如果您添加,删除或重命名了至少一个(非瞬态)字段,那么您可能会使新类仍然与旧类兼容,但更痛苦。我们必须知道改变的性质才能帮助您。

我个人会避免使用本机序列化进行长期存储,因为正如您刚才注意到的那样,它很脆弱并且很难更改模型。我会使用更易读和可迁移的文件格式:例如XML或JSON。