How to serialize an object that includes BufferedImages

余生长醉 提交于 2019-11-26 06:43:49

问题


I\'m trying to create a simple image editing program in java. I made an ImageCanvas object that has all the information about the image that is being edited (some basic properties, list of effects being applied, a list of BufferedImage layers, etc.) and I wanted a simple way to save it to disk so it could be opened again later.

I figured that using Java\'s defualt Serializable interface might be exactly what I was looking for and I could just write the entire object to file and read it back into memory again at a later time. However, ImageCanvas includes an ArrayList<BufferedImage>, and BufferedImage\'s are not serializable (everything else is).

I know it is possible to override the writeObject() and readObject() methods, but I have never done so and I was wondering if there is any easy way to have Java serialize everything else and have some custom way to read/write the BufferedImage\'s to disk? Or is there some other way to easily write the entire ImageCanvas object to disk that I\'m overlooking? Eventually I might implement my own custom image file type, but for right now I wanted a quick and easy way to save files temporarily while I am testing (the ImageCanvas class will change a lot, so I didn\'t want to have to keep updating my custom file type before I have it finalized).


回答1:


make your ArrayList<BufferedImage> transient, and implement a custom writeObject() method. In this, write the regular data for your ImageCanvas, then manually write out the byte data for the images, using PNG format.

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:


Serialization is pretty straight-forward in that it persists static data. You are otherwise in the right place with read/write object in the Serialization family of methods. Think about what a "BufferedImage" is. It is a buffered streaming implementation. To serialize, the data must be flushed out to a static object like a byte[] array and then THAT object may be serialized/deserialized into/out of a BufferedImage such that the buffered streaming now comes in/out of that byte[] array.



来源:https://stackoverflow.com/questions/15058663/how-to-serialize-an-object-that-includes-bufferedimages

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!