我正在尝试将一个带有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
答案 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);
}