如何序列化包含缓冲区图像的对象

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

我认为使用Java的devalat接口可能正是我正在寻找的,我可以将整个对象写入文件,并在以后再次将其读回内存中。但是,包含 一个 和 '是不可序列化的(其他所有内容都是)。SerializableImageCanvasArrayList<BufferedImage>BufferedImage

我知道可以重写和方法,但我从未这样做过,我想知道是否有任何简单的方法可以让Java序列化其他所有内容,并有一些自定义方法来读/写到磁盘?或者有没有其他方法可以轻松地将整个对象写入我忽略的磁盘?最终,我可能会实现自己的自定义图像文件类型,但现在我想要一种快速简便的方法,在测试时临时保存文件(类会发生很大变化,所以我不想在最终确定之前不断更新我的自定义文件类型)。writeObject()readObject()BufferedImageImageCanvasImageCanvas


答案 1

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

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));
        }
    }
}

答案 2

序列化非常简单,因为它保留了静态数据。否则,在序列化系列方法中使用读/写对象的位置是正确的。想想什么是“缓冲图像”。它是一个缓冲流式处理实现。要进行序列化,必须将数据冲洗到静态对象(如 byte[] 数组),然后该对象可以序列化/反序列化到/反序列化到/流出 BufferedImage 中,以便缓冲流现在传入/传出该 byte[] 数组。