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

在JavaFX应用程序中将颜色保存为状态,java,file,serialization,javafx,javafx-8,Java,File,Serialization,Javafx,Javafx 8,我有一个绘制形状的应用程序。形状知道它们的颜色和大小是一个整数。我想让这个程序将形状保存到一个文件中。JavaFX的颜色类不可序列化 我是否应该序列化对象,是否应该忘记使用ObjectOutputStreams和ObjectInputStreams?在JavaFX中有没有其他更好的方法 我不能告诉你,哪种方法是解决用例最常用的方法,但我们有一种类似的方法,在这种方法中,我们序列化一个状态。我们使用XML将其状态持久化 对于颜色属性,我们创建了自己的颜色转换器,以使颜色可序列化。转换器只关心颜色的

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


我是否应该序列化对象,是否应该忘记使用ObjectOutputStreams和ObjectInputStreams?在JavaFX中有没有其他更好的方法

我不能告诉你,哪种方法是解决用例最常用的方法,但我们有一种类似的方法,在这种方法中,我们序列化一个状态。我们使用XML将其状态持久化

对于颜色属性,我们创建了自己的颜色转换器,以使颜色可序列化。转换器只关心颜色的红、绿、蓝值及其不透明度。这样,当涉及到颜色属性时,XML保持简单和干净

谈到形状的序列化,整个事情变得更加复杂,因为xStream序列化了对象的所有依赖项。因此,您可能希望为每个阴影创建模板对象,以便只存储所需的信息,而忽略其余信息。这也将确保您不受javafxapi中未来可能的形状更改的影响


还有一个小的javafx xstream converter集合,名为,它可能为您保存有趣的转换器。

我不能告诉您,这是解决您的用例的最常见的方法,但我们有一个simular集合,其中我们序列化了一个形状状态。我们使用XML将其状态持久化

对于颜色属性,我们创建了自己的颜色转换器,以使颜色可序列化。转换器只关心颜色的红、绿、蓝值及其不透明度。这样,当涉及到颜色属性时,XML保持简单和干净

谈到形状的序列化,整个事情变得更加复杂,因为xStream序列化了对象的所有依赖项。因此,您可能希望为每个阴影创建模板对象,以便只存储所需的信息,而忽略其余信息。这也将确保您不受javafxapi中未来可能的形状更改的影响


还有一个名为的小型javafx xstream converter集合,它可能会为您保存一些有趣的转换器。

您可以将可序列化的类实例存储到文件中,而不是存储在形状中。让此类实现一个方法Object readResolve抛出ObjectStreamException以恢复形状

下面是一个简单的矩形示例,它序列化了宽度、高度和颜色:

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));
}
Node node;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data/shapeser.ser"))) {
    node = (Node) ois.readObject();
}

您可以将可序列化类实例存储到文件而不是形状。让此类实现一个方法Object readResolve抛出ObjectStreamException以恢复形状

下面是一个简单的矩形示例,它序列化了宽度、高度和颜色:

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));
}
Node node;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data/shapeser.ser"))) {
    node = (Node) ois.readObject();
}

下面是一个关于这个问题的简短的阿拉伯斯语

导入java.io.Serializable; 导入javafx.scene.paint.Color; 公共类SerializableColor实现了SerializableColor { 私人双红; 私人双绿; 私人双蓝; 私人双阿尔法; 公共序列化颜色 { this.red=color.getRed; this.green=color.getGreen; this.blue=color.getBlue; this.alpha=color.getOpacity; } 公共序列化颜色双红双绿双蓝双阿尔法 { 这个红色=红色; 这个.绿色=绿色; 蓝色=蓝色; 这个α=α; } 公共颜色getFXColor { 返回新颜色红色、绿色、蓝色、alpha; } }
下面是一个关于这个问题的简短的阿拉伯斯语

导入java.io.Serializable; 导入javafx.scene.paint.Color; 公共类SerializableColor实现了SerializableColor { 私人双红; 私人双绿; 私人双蓝; 私人双阿尔法; 公共序列化颜色 { this.red=color.getRed; this.green=color.getGreen; this.blue=color.getBlue; this.alpha=color.getOpacity; } 公共序列化颜色双红双绿双蓝双阿尔法 { 这个红色=红色; 这个.绿色=绿色; 蓝色=蓝色; 这个α=α; } 公共颜色getFXColor { 返回新颜色红色、绿色、蓝色、alpha; } }