Java 将包含BuffereImage的对象写入磁盘

Java 将包含BuffereImage的对象写入磁盘,java,serialization,bufferedimage,transient,Java,Serialization,Bufferedimage,Transient,我有一个对象BatchState,它有指向许多数据段的指针,包括buffereImage。我需要序列化对象 以下是我的缓冲区图像的简化版本: public class BatchState implements Serializable{ private int anInt; //A bunch of other primitives and objects //... private transient Image image; //This is the Bu

我有一个对象
BatchStat
e,它有指向许多数据段的指针,包括
buffereImage
。我需要序列化对象

以下是我的
缓冲区图像的简化版本:

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
尽管BuffereImage是瞬态的,但仍然会出现这种情况

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

  • 找到将
    缓冲区图像
    与其余数据一起序列化的方法,或
  • 找到一种方法,将
    批处理状态
    序列化为一个文件,然后将
    缓冲区图像
    写入一个单独的文件

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

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

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

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

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

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

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


    这个故事的寓意是:ObjectOutputStream甚至可以序列化嵌套很深的对象。

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

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


    这个故事的寓意是:ObjectOutputStream甚至可以序列化嵌套很深的对象。

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

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


    这个故事的寓意是:ObjectOutputStream甚至可以序列化嵌套很深的对象。

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

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


    故事的寓意是:ObjectOutputStream甚至可以序列化嵌套很深的对象。

    您的代码对我来说运行良好(当然,初始化图像并更改文件名)。您确定没有忘记将另一个图像变量标记为transient吗?您的代码不会引发该异常。您必须运行一个较旧的版本,并且在
    图像上没有
    transient
    关键字。
    要更快地获得更好的帮助,请发布一个.BTW-存储大量不同信息的好方法是在Zip文件中。Each资源可以在Zip中有自己的“路径”,并且很容易访问。您的代码对我来说运行良好(当然,初始化图像和更改文件名)。您确定没有忘记将另一个图像变量标记为transient吗?您的代码不会引发该异常。您必须运行一个较旧的版本,并且在
    图像上没有
    transient
    关键字。
    要更快地获得更好的帮助,请发布一个.BTW-存储大量不同信息的好方法是在Zip文件中。Each资源可以在Zip中有自己的“路径”,并且很容易访问。您的代码对我来说运行良好(当然,初始化图像和更改文件名)。您确定没有忘记将另一个图像变量标记为瞬态吗?您的代码不会引发该异常。您必须运行一个较旧的版本,并且在
    图像上没有
    transient
    关键字。
    若要更快地获得更好的帮助,请发布一个.BTW-停止的好方法