在我继承的代码中,下面的方法位于可序列化的类中(其中部分内容显示在上下文中)。
尝试读取包含此内容的数据时会引发以下错误:
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.scene.chart.XYChart$Series
不可序列化——这就是为什么HashMap
不可序列化。
我的修复:将破坏的
HashMap
复制到更简单的数据结构,同时使序列化类中的 HashMap
瞬态,并在文件加载后重新创建它。
感谢jewelsea指出这一点。