我将应用程序中的绘图保存到带序列化的文件中,但是当我尝试将序列化的文件读回同一对象时,我收到此错误:java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.sun.javafx.collections.ObservableListWrapper
在这里你可以看到我的方法如何:
public Drawing load(String nameDrawing) {
Drawing drawing;
try (FileInputStream fis = new FileInputStream(nameDrawing + ".txt")) {
try (ObjectInputStream ois = new ObjectInputStream(fis)) {
drawing = (Drawing) ois.readObject();
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
return null;
} catch (ClassNotFoundException ex) {
System.out.println(ex.getMessage());
return null;
}
return drawing;
}
我不认为我需要让另一个类实现Serializable,因为我设法将对象序列化到文件中,那么它应该没问题呢?
我认为它与我的Drawing类和我的可观察列表有关,但我不知道如何修复它。这是我的绘图课程的一部分:
public class Drawing extends DrawingItem {
//Fields
private String name;
private ArrayList<DrawingItem> items;
private Point anchor;
private double width;
private double height;
private ObservableList<DrawingItem> observableList;
//Getters-setters
public String getName() {
return name;
}
public List<DrawingItem> getItems() {
return Collections.unmodifiableList(items);
}
public ObservableList<DrawingItem> itemsToObserve() {
return FXCollections.unmodifiableObservableList(observableList);
}
答案 0 :(得分:2)
您需要让该类的所有成员都可序列化。您可以提供自己的序列化程序或确保您使用的类型是可序列化的+标记您不需要序列化为transient
的那些。
假设DrawingItem和Point是可序列化的,你应该做得很好:
private transient ObservableList<DrawingItem> observableList;
。
答案 1 :(得分:0)
NotSerializableException: com.sun.javafx.collections.ObservableListWrapper
如果您阅读此异常,则会看到它告诉您com.sun.javafx.collections.ObservableListWrapper
课程不是Serializable
。
接下来,就像当天晚上一样,你正在尝试序列化的类中有一个非瞬态实例成员,在垃圾收集意义上,导致com.sun.javafx.collections.ObservableListWrapper
的实例
解决方案:找到并修复它。
这里真正好奇的是你在编写这个流时忽略了异常的原因。