在JavaFX应用程序中将颜色保存为状态

时间:2016-04-20 15:21:32

标签: java file serialization javafx javafx-8

我有一个绘制形状的应用程序。形状知道它们的颜色和大小(整数)。我希望这个程序将形状保存到文件中。 JavaFX的颜色类不可序列化。

我不应该序列化对象吗?我应该忘记使用ObjectOutputStreams和ObjectInputStreams吗?在JavaFX中有另一种首选方法吗?

3 个答案:

答案 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); } }