为什么javafx.scene.text.Font不能序列化?

时间:2013-07-16 14:16:09

标签: java serialization fonts javafx-2 javafx

旧的java.awt.Font可以方便地序列化 - 但有点烦人的是,JavaFX font class不是。更令人讨厌的是,手动序列化很麻烦,因为构造函数中指定的FontPostureFontWeight对象在构造之后不可用(不得不求助于调用和解析getStyle()。)I我很难想到为什么会出现这种情况,从表面上看,至少我当然看不到AWF字体上没有的任何功能,这些功能在序列化上很难实现。

有什么技术原因可以解释为什么我缺少这种情况,或者它是否会在将来的版本中纠正API异常?

2 个答案:

答案 0 :(得分:1)

我怀疑它与可序列化类有关,通常在发行版之间不兼容。如果应用程序依赖于可序列化的UI,则可能在发布之间存在一些主要问题。您可以看到有关使用序列化的warning on swing components

  

警告:此类的序列化对象与以后的Swing版本不兼容。当前的序列化支持适用于运行相同版本Swing的应用程序之间的短期存储或RMI。从1.4开始,java.beans包中添加了对所有JavaBeansTM的长期存储的支持。请参阅XMLEncoder。

那就是说,我也会在这里提出我的意见。对我来说,它与MVC分离混淆是序列化UI(当然还有其他的结构 - MVC不是一个金色的子弹)。把你关心的东西放在一个单独的对象中似乎更简单;你已经编写了用于执行UI的代码 - 如果需要具有特定的x / y坐标,或者对象应该集中在启动上,那么保存该信息而不是每个默认颜色,监听器都是有意义的,与节点相关联的皮肤。

您可能有不同的需求 - 我根据您的问题不知道。如果你正在寻找一种从文件中加载UI的方法(而不是关心保存),我建议你研究一下FXML和CSS(我假设你已经知道了这些东西)

答案 1 :(得分:1)

JavaFX中很少有东西是序列化的。您可以通过查看javadoc的serialized-form页面找到可序列化的所有内容。有了它,您可以看到,可以序列化的唯一事物是基于旧的可序列化java.util.EventObject和与Swing集成的JFXPanel的事件。其他一切都不可序列化。因此,当几乎没有别的东西可以序列化时,Font是非常不典型的。

JavaFX本身在很大程度上依赖于它的动态属性机制,它依赖于绑定和更改侦听器。底层属性系统本身(目前)不可序列化,因此这就是JavaFX中没有大量序列化的原因之一。

也就是说,Font对象在JavaFX中很少见,因为它似乎是不可变的,只提供了构造函数和getter方法,并且没有使用任何属性。因此理论上它可以很容易地进行序列化。您可以提出feature request提出此建议。它可能被视为低优先级,因为JavaFX本身并不真正依赖序列化。除非有必要与现有的api或框架集成,否则JavaFX实现中的序列化方法似乎不会序列化。

如果您对JavaFX中的序列化有进一步的疑问,并且框架背后的原因没有充分利用它,您可以在openjfx-dev mailing list上询问。我的猜测(类似于尼克在他的回答中提到的警告),由于众多原因,决定框架中的一揽子序列化支持是一个坏主意,所以故意做出决定不支持它(但这只是猜测)。