序列化 - ReadObject错误

时间:2017-09-27 16:19:22

标签: java serialization

我将应用程序中的绘图保存到带序列化的文件中,但是当我尝试将序列化的文件读回同一对象时,我收到此错误: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);
    }

2 个答案:

答案 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的实例

解决方案:找到并修复它。

这里真正好奇的是你在编写这个流时忽略了异常的原因。