【问题标题】:Write to disk an object that contains a BufferedImage将包含 BufferedImage 的对象写入磁盘
【发布时间】:2013-12-11 06:08:22
【问题描述】:

我有一个对象BatchState,它有指向多条数据的指针,包括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
    //...
}

我已将 Image 设为瞬态,以便我可以使用 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 写入一个单独的文件中。

任何一种解决方案都可以。

【问题讨论】:

  • 您的代码对我来说运行良好(当然是初始化图像并更改文件名)。您确定没有忘记标记为瞬态的另一个 Image 变量吗?
  • 您的代码不会引发该异常。您必须在 image. 上运行没有 transient 关键字的旧版本
  • 如需尽快获得更好的帮助,请发帖 SSCCE。顺便说一句 - 存储一堆不同信息的好方法是在 Zip 文件中。每个资源在 Zip 中都可以有自己的“路径”,而且它们很容易访问。

标签: java serialization bufferedimage transient


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    解决了。它涉及我上面显示的代码中未包含的其他一些数据。不过,你们的 cmets 帮助我意识到了问题所在。

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

    故事的寓意:ObjectOutputStream 将序列化甚至深度嵌套的对象。

    【讨论】:

    • 当然可以。它将序列化除transientstatic 成员之外的整个对象图。
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多