我正在使用JavaFX创建一个像Scratch这样的儿童编程平台。我有一系列命令,当我单击它们时,它们输入我的“ CodeBox”,它扩展了标准JavaFX类VBox。当然,我想在代码中添加“保存”和“恢复”功能。但是由于JavaFX对象不是Serializable,所以我面临着深重的麻烦。
要尝试,我扩展了JavaFX Button类
public class fButton extends Button implements Serializable{
并添加了另一个命令将该fButton对象保存到文件中,并且该文件似乎已写入(在UTF-8中):
�� sr fButtonaDN�� D orgSceneXD orgSceneYD
orgTranslateXD
orgTranslateYxp
我还有另一个命令从文件读取fButton并将其添加到现有的VBox中。执行该命令时,似乎添加了一个空按钮,其中不包含fButton的文本或任何其他属性。
现在我想知道是否有任何方法可以保存和检索所有这些对象,或者是否有更好的方法。
为方便起见,我使用的是JDK9.0.4和IntelliJ IDEA Ultimate 2018.3.。感谢您的考虑。
答案 0 :(得分:4)
现在我想知道是否有任何方法可以保存和检索所有这些对象,或者是否有更好的方法。
序列化UI组件以保存状态通常是一种非常糟糕的方法,因为它会在UI和应用程序状态之间形成疯狂紧密耦合。
如果要在将来的版本中将VBox换成自定义StackPane组件怎么办?这是一个非常现实的场景-也许您想例如通过覆盖一些其他组件来装饰这些VBoxes-但这样做立即会破坏任何人的能力,然后再加载以前版本中保存的文件。
我认为您的后端状态应该与UI完全分开-然后,您可以通过任何您喜欢的方式(JSON,XML,其他Java序列化程序等)单独序列化后端状态,并依赖于渲染/转换器层为您的后端状态创建相关组件。
然后将两者分离,允许进行任何所需的序列化,并为更改UI层提供更多的空间,而不会过多地破坏后端模型。
答案 1 :(得分:1)
对于保存和加载,我建议使用JSON或XML文件。有一个单独的图像文件夹。保存文件时,请保存图像文件路径。然后可以在加载时附加图像或文本。
@Override
protected void onNewIntent(Intent intent) {
......
}
答案 2 :(得分:1)
Button
不可序列化,并且不能从其继承,并且实现Serializable
不可使其可序列化。那么在反序列化fButton
时会发生什么?
位于序列化处:JVM仅忽略继承字段的值并序列化默认值。在您的情况下,这可能意味着所使用的String
被序列化为null
。
:JVM为不可序列化的继承类调用no-arg构造函数。在您的情况下,这可能意味着Button
会以空字符串作为标签进行初始化。
如果您想控制序列化,请阅读内部/外部序列化以获得更好的控制。在您的情况下,请勿依赖默认序列化。