从文件重新加载 JavaFX 形状

问题描述 投票:0回答:1

在我继承的代码中,下面的方法位于可序列化的类中(其中部分内容显示在上下文中)。

尝试读取包含此内容的数据时会引发以下错误:

java.io.WriteAbortedException:写入中止; java.io.NotSerializedException: javafx.scene.chart.XYChart$Series

public class PCAGraph extends Graph implements Serializable {

    private String[] pcaColumnLabels; // store pca column name: PCA 1, PCA 2, ...
    private final List<String> eigenValues; // store eigen values
    private transient XYChart.Series<Number, Number> series;
    private transient BufferedReader bufferReader;
    private transient ScatterChart<Number, Number> pcaChart;
    private String line;
    private HashMap groupColors;
    private HashMap groupIcons;
    private transient MainController mainController;
    // group name -> with all associated graphs for different values of k
    private HashMap<String, ArrayList<XYChart.Series<Number, Number>>> hiddenPCAGroups = new HashMap<>();
    private int labelClickCounter;
    private transient Label firstGroupLabel, secondGroupLabel;
    private Project project;

// detail omitted

    private HashMap<String, ArrayList<XYChart.Series<Number, Number>>> hiddenPCAGroups = new HashMap<>();


    public void hideGroup(String oldGroupName) {

        ArrayList<XYChart.Series<Number, Number>> hiddenGroups = new ArrayList<>(); // for various Ks

        // all pca charts
        for (int i=0; i<mainController.getPcaChartsList().size();i++){
            ScatterChart<Number, Number> chart = mainController.getPcaChartsList().get(i);

            for(int j=0;j<chart.getData().size();j++){
                XYChart.Series<Number, Number> series = chart.getData().get(j);

                if (series.getName().equals(oldGroupName)) {

// removing the next line stops the hiddenness from
// being saved and gets rid of the exception on opening:
                    hiddenGroups.add(series); // save this series
                    chart.getData().remove(j); // remove it from the chart

                    // set color, icon, click event and legend for this chart
                    for(int k=0; k<chart.getData().size(); k++) {
                        // set legend
                        setLegend(chart, k, project.getPcaGroupColors(), project.getPcaGroupIcons());
                    }
                    break;
                }
            }
        }

        hiddenPCAGroups.put(oldGroupName, hiddenGroups);
    }

// more detail omitted

}

如果我指示的行被注释掉,则更改确实会显示在屏幕上(此处缺少的其他代码会执行此操作),但保存不会保存隐藏性,并且可以正常打开。如果将该行放回原处,我会抛出如上所述的异常。

我知道 Hashmap 是自动可序列化的,但是序列化其内容可能会出现一些复杂情况,尽管 ArrayList 和 Number 不是可序列化的?

这是代码中此类的一个示例。欢迎任何有关追查问题的帮助。

javafx serialization deserialization
1个回答
0
投票

总结一下我从评论中得到的内容,

javafx.scene.chart.XYChart$Series
不可序列化——这就是为什么
HashMap
不可序列化。

我的修复:将破坏的

HashMap
复制到更简单的数据结构,同时使序列化类中的
HashMap
瞬态,并在文件加载后重新创建它。

感谢jewelsea指出这一点。

© www.soinside.com 2019 - 2024. All rights reserved.