JavaFX:在二进制文件中保存具有Image属性的对象

时间:2018-02-25 12:54:44

标签: java image javafx binaryfiles

我正在尝试将一个带有Image(javaFX)属性的类保存在二进制文件中,但是当Image不同于null时,我得到一个IOException。

是否可以通过使用Image对象或以其他方式使其工作?

这是一个显示问题的演示类。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RootElement>
    <parent1child1>
        <parent1child1child1>value1</parent1child1child1>
        <parent1child1child2>value2</parent1child1child2>
        <parent1child1child3>value3</parent1child1child3>
    </parent1child1>
    <parent1child2>value4</parent1child2>
</RootElement>
value1
value2
value3
value4

2 个答案:

答案 0 :(得分:0)

首先,看看this,我不知道你为什么不打印你的堆栈跟踪。

为了帮助你,你需要

public static class TheObject implements Serializable

另外,将其添加到对象:

TheObject() { //default constructor

 }

最后,如果导入javafx.scene.image.Image没有实现可序列化的接口,那么你必须做一些像this

这样的事情。

我确实遇到了问题(5分钟前发布)。你可能也会面对它......看看:Serialize Obj with 2 BufferedImage transient fields, second image won't be read

编辑:如果您打印过堆栈跟踪,谷歌会告诉您通往此的方式......

答案 1 :(得分:0)

Image不可序列化,因此您需要实现自定义(反)序列化。您可以将图片转换为BufferedImage并使用ImageIO将数据写入ObjectOutputStream以执行此操作。

同样TheObject需要实施Serializable

public static class TheObject implements Serializable {
    private int id;
    private transient Image img; // not written to stream via default serialisation

    TheObject(int id, Image img) {
      this.id = id;
      this.img = img;
    }

    ...

    // custom serialisation
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject(); // write non-transient data

        // write image if not null
        out.writeBoolean(img != null);
        if (img != null) {
            ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", out);
        }
    }

    // custom deserialisation
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        // read non-transient data
        in.defaultReadObject();

        // read image if not null
        if (in.readBoolean()) {
            img = new Image(in);
        } else {
            img = null;
        }
    }
}

还记得关闭输出流或更好:使用try-with-resources:

try (FileOutputStream fos = new FileOutputStream("file");
     ObjectOutputStream outputStream = new ObjectOutputStream()) {

    outputStream.writeObject(obj1);
    outputStream.writeObject(obj2);
    outputStream.writeObject(obj3);
} catch(IOException e) {
    System.out.println("IOException");
    System.exit(0);
}