如何序列化包含BufferedImages的对象

我正在尝试在java中创build一个简单的图像编辑程序。 我创build了一个ImageCanvas对象,其中包含有关正在编辑的图像的所有信息(一些基本属性,应用的效果列表, BufferedImage图层列表等),我想要一个简单的方法将其保存到磁盘,可以稍后再打开。

我认为使用Java的defizable Serializable接口可能正是我所期待的,我可以将整个对象写入文件,并在以后再次读回到内存中。 然而, ImageCanvas包含一个ArrayList<BufferedImage> ,并且BufferedImage不是可序列化的(其他的都是)。

我知道有可能重写writeObject()readObject()方法,但我从来没有这样做,我想知道是否有任何简单的方法让Java序列化的一切,并有一些自定义的方式来读/写BufferedImage到磁盘? 或者还有其他方法可以轻松将整个ImageCanvas对象写入磁盘,我忽略了吗? 最终,我可能会实现自己的自定义图像文件types,但现在我想要一个快速简单的方法来临时保存文件,而我正在testing( ImageCanvas类会改变很多,所以我不想保持更新我的自定义文件types之前,我已经敲定)。

使你的ArrayList<BufferedImage>瞬态,并实现一个自定义的writeObject()方法。 在这里,写入ImageCanvas的常规数据,然后使用PNG格式手动写出图像的字节数据。

 class ImageCanvas implements Serializable { transient List<BufferedImage> images; private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeInt(images.size()); // how many images are serialized? for (BufferedImage eachImage : images) { ImageIO.write(eachImage, "png", out); // png is lossless } } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); final int imageCount = in.readInt(); images = new ArrayList<BufferedImage>(imageCount); for (int i=0; i<imageCount; i++) { images.add(ImageIO.read(in)); } } } 

序列化是非常直接的,因为它保持静态数据。 否则,您在Serialization系列方法中具有读/写对象的正确位置。 想想“BufferedImage”是什么。 这是一个缓冲stream式实现。 为了序列化,必须将数据刷新到像byte []数组这样的静态对象,然后THAT对象可以被序列化/反序列化到BufferedImage中或者从BufferedImage中出来,使得缓冲stream现在进出该byte []数组。