我有一个对象BatchStat
,它包含指向多个数据的指针,包括BufferedImage
。我需要序列化对象。
以下是我BufferedImage
的简化版:
public class BatchState implements Serializable{
private int anInt;
//A bunch of other primitives and objects
//...
private transient Image image; //This is the BufferedImage
//Constructors, methods, and so forth
//...
}
我已将图像瞬态化,以便我可以使用ImageIO将其写入不同的文件。
我正在尝试使用以下代码序列化对象:
public void saveState(){
ObjectOutputStream oos = null;
FileOutputStream fout = null;
try{
fout = new FileOutputStream("data/saved/"+Client.getUser()+".sav", true);
oos = new ObjectOutputStream(fout);
oos.writeObject(batchState);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
但是,每次调用此方法时,我的程序都会抛出以下异常:
java.io.NotSerializableException: java.awt.image.BufferedImage
尽管BufferedImage是暂时的,但仍然存在。
我正在寻找两种解决方案之一:
BufferedImage
以及其他数据,或BatchState
序列化为一个文件,然后将BufferedImage
写入单独的文件。两种解决方案都没问题。
答案 0 :(得分:3)
您可以自己编写一个自定义writeObject()
方法,首先调用out.defaultWriteObject()
然后调用ImageIO.write(image, "jpeg", out)
(或者您喜欢的任何格式,以及类似的自定义readObject()
方法对于这些方法的正确签名,请参阅对象序列化规范。
答案 1 :(得分:0)
解决。它涉及一些我未在上面展示的代码中包含的其他数据。你们这些人的评论让我意识到问题所在。
事实证明,可见的BufferedImage根本不是问题。我有一个指向另一个对象的指针,该对象还包含一个BufferedImage,而另一个BufferedImage(嵌套在另一个对象中)导致OutputStream抛出异常。
故事的道德:ObjectOutputStream将序列化甚至深层嵌套的对象。