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-停止的好方法