XYChart.Series 没有在 javafx 中序列化

XYChart.Series not serializing in javafx

我正在创建一个 javafx 健康程序,其中包含一个带有 XYChart.Series 参数的对象 Person。在调用我的 save() 方法时创建用户后,出现错误 Error writing to data file: javafx.scene.chart.XYChart$Series

这是我创建人员并将其添加到我的 ArrayList 用户列表时的代码:

Person person  = new Person(height, weight, age, waist, gender, username, password, activityIntensity, calorieSeries, waterSeries, exerciseSeries);

userList.add(person);

还有我的保存方法:

public void save()
{
    FileOutputStream fileID;
    ObjectOutputStream outFile;

    try
    {
        fileID = new FileOutputStream(FILENAME);
        outFile   = new ObjectOutputStream(fileID);

        outFile.writeObject(userList);

        outFile.close();
    }
    catch (IOException e)
    {
        System.out.println("Error writing to data file: " + e.getMessage());
    }
}

之前,我保存的是 arrayLists 而不是 XYChart.Series 并且工作正常,但我不明白为什么它不保存 XYChart.Series 到 .ser 文件。

XYChart.Series class 不是 Serializable,因此当您尝试序列化任何包含它的对象作为其持久状态的一部分时,您将收到错误消息。您有几个选择:

  1. 不要保留图表数据。您可以通过将图表数据字段包含为 transient
  2. 来执行此操作
  3. 实施 Externalizable 而不是 Serializable。您将必须实施 readExternalwriteExternal 方法。这可能有点痛苦,因为您似乎有很多字段,但基本上您的 writeExternal 方法会写入所有可序列化字段,然后写入图表数据的可序列化形式(例如,将数据写入一个 ArrayList)。 readExternal 方法将读回数据(以相同的顺序)并从中重建字段值;对于图表数据,它将读取 ArrayList(例如)并从中构建图表数据。

你没有 post 你的 Person class,所以我真的不能提供更多关于如何做的细节,但这个描述应该足够了。

只是评论:让你的 Person class(本质上是模型数据,即实体)保留对 XYChart.Series 的引用似乎有点奇怪的设计(这实际上是 UI 数据,充其量它属于视图模型)。实体应该真正不知道其中的数据是如何呈现的。最好在 Person class 中恢复使用 java.util.List,然后 "wiring" 从那里到其他地方的图表的数据。