将包含BufferedImage的对象写入磁盘

时间:2013-12-11 06:08:22

标签: java serialization bufferedimage transient

我有一个对象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是暂时的,但仍然存在。

我正在寻找两种解决方案之一:

  1. 找到一种方法来序列化BufferedImage以及其他数据,或
  2. 找到一种方法将BatchState序列化为一个文件,然后将BufferedImage写入单独的文件。
  3. 两种解决方案都没问题。

2 个答案:

答案 0 :(得分:3)

您可以自己编写一个自定义writeObject()方法,首先调用out.defaultWriteObject()然后调用ImageIO.write(image, "jpeg", out)(或者您喜欢的任何格式,以及类似的自定义readObject()方法对于这些方法的正确签名,请参阅对象序列化规范。

答案 1 :(得分:0)

解决。它涉及一些我未在上面展示的代码中包含的其他数据。你们这些人的评论让我意识到问题所在。

事实证明,可见的BufferedImage根本不是问题。我有一个指向另一个对象的指针,该对象还包含一个BufferedImage,而另一个BufferedImage(嵌套在另一个对象中)导致OutputStream抛出异常。

故事的道德:ObjectOutputStream将序列化甚至深层嵌套的对象。