我有一个绘制形状的应用程序。形状知道它们的颜色和大小(整数)。我希望这个程序将形状保存到文件中。 JavaFX的颜色类不可序列化。
我不应该序列化对象吗?我应该忘记使用ObjectOutputStreams和ObjectInputStreams吗?在JavaFX中有另一种首选方法吗?
答案 0 :(得分:1)
我无法告诉你,这是解决你的用例的最常用方法,但我们有一个类似的方法,我们序列化一个形状状态。我们使用xStream在XML中保持其状态。
对于Color Attributes,我们创建了一个自己的ColorConverter来制作Color Serializable。转换器只关心颜色的红色,绿色和蓝色值以及它的不透明度。这样,当涉及到颜色属性时,XML保持简单和干净。
谈论形状的序列化,整个事情变得更加复杂,因为xStream序列化了对象的所有依赖关系。因此,您可能希望为每个阴影创建模板对象,以便仅存储所需的信息,而忽略其余信息。这也将确保您在javafx api中保持独立于未来可能的形状变化。
还有一个名为XStreamFX的小型javafx xstream转换器集合,可能会为您提供有趣的转换器。
答案 1 :(得分:1)
您可以将可序列化的类实例存储到文件而不是形状。让这个类实现一个恢复形状的方法Object readResolve() throws ObjectStreamException
。
以下是Rectangle
的一个简单示例,它将宽度,高度和颜色序列化:
public class RectData implements Serializable {
public RectData(Rectangle rect) {
this.width = rect.getWidth();
this.height = rect.getHeight();
Color color = (Color) rect.getFill();
this.color = (int) (color.getRed() * 0xFF) |
((int) (color.getGreen() * 0xFF)) << 010 |
((int) (color.getBlue() * 0xFF)) << 020 |
((int) (color.getOpacity() * 0xFF)) << 030;
}
private final int color;
private final double width;
private final double height;
private Object readResolve() throws ObjectStreamException {
Rectangle rect = new Rectangle(width, height);
rect.setFill(Color.rgb(
color & 0xFF,
(color >>> 010) & 0xFF,
(color >>> 020) & 0xFF,
(color >>> 030) / 255d));
return rect;
}
}
示例序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data/shapeser.ser"))) {
Rectangle rect = new Rectangle(100, 200);
rect.setFill(Color.CHOCOLATE);
oos.writeObject(new RectData(rect));
}
Deserialisation
Node node;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data/shapeser.ser"))) {
node = (Node) ois.readObject();
}
答案 2 :(得分:1)
这是围绕这个问题的快速蔓藤花纹。
import java.io.Serializable;
import javafx.scene.paint.Color;
public class SerializableColor implements Serializable
{
private double red;
private double green;
private double blue;
private double alpha;
public SerializableColor(Color color)
{
this.red = color.getRed();
this.green = color.getGreen();
this.blue = color.getBlue();
this.alpha = color.getOpacity();
}
public SerializableColor(double red, double green, double blue, double alpha)
{
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
}
public Color getFXColor()
{
return new Color(red, green, blue, alpha);
}
}