gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:40:34 25 4
gpt4 key购买 nike

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

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 block ,我应该早点完成,但我仍然不知道解决方案。堆栈跟踪:

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 进行了更改。因此,您现在拥有的类不再与将对象序列化到文件时的类兼容。

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

private static final long serialVersionUID = -1393576200767336208;

如果您添加、删除或重命名了至少一个(非暂时性)字段,那么您可能会使新类仍然与旧类兼容,但会带来更多痛苦。我们必须了解这些变化的性质才能为您提供帮助。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com