我想从文件到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();


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

编辑:删除了try-catch块,我应该早些做,但是我仍然不知道解决方案。堆栈跟踪:

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)

最佳答案

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

如果您不更改类(及其所有超类)的字段的数目和名称,则可以通过在类中添加以下变量声明来使其再次兼容:

private static final long serialVersionUID = -1393576200767336208;


如果您添加,删除或重命名了至少一个(非瞬态)字段,则可能会使新类仍与旧类兼容,但会更加麻烦。而且我们将必须知道变更的性质才能为您提供帮助。

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

关于java - readObject()无法正常工作并从方法中中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16122321/

10-11 07:39