当前位置: 首页 > 面试题库 >

如何序列化包含BufferedImages的对象

贾俊喆
2023-03-14
问题内容

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

我发现使用Java的defualt
Serializable接口可能正是我想要的,我可以将整个对象写到文件中,稍后再读回内存中。但是,ImageCanvas包括ArrayList<BufferedImage>BufferedImage不能序列化(其他所有方法都可以)。

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


问题答案:

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


 类似资料:
  • 问题内容: 顾名思义,我正在尝试将包含一些BufferedImages(包括其他变量,字符串等)的对象保存到文件中。 我发现了这一点: 如何序列化包含BufferedImages的对象 它的工作原理就像一种魅力,但有一点点挫折:如果您的对象仅包含一个图像,它就可以很好地工作。 我一直在努力获取他的解决方案以处理多个图像(理论上应该可以使用),但是每次读入文件时,我都会得到对象,图像数量正确,但只有

  • 然后是班级选拔: 教材: 因此,我主要创建新用户并将其序列化: 一切都很完美,但如果我这样做: 然后我想序列化对象用户,程序崩溃了。我得到的结果是: JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOu

  • 问题内容: 我需要一些有关将包含多维数组的JSON对象转换为类的帮助。我试图反序列化json对象,但失败了。JsonMaclar类对象为null。请帮忙。 脚本代码; C#代码; 问题答案: 我建议您使用JSON.NET。它是一个开放源代码库,用于将c#对象序列化和反序列化为json,将Json对象序列化为.net对象… 序列化示例: Json.NET 4.5版本8 –多维数组支持,Unicode

  • 问题内容: 我有一个对象(解析树),其中包含子节点,这些子节点是对其他节点的引用。 我想使用序列化此对象,但是我得到了 TypeError:循环对象值 因为我提到的结构。 我该如何解决?对我而言,在序列化对象中是否表示对其他节点的引用并不重要。 另一方面,在创建对象时从对象中删除这些属性似乎很乏味,我也不想对解析器(水仙)进行更改。 问题答案: 使用的第二个参数,该替代品的功能,以排除已序列化对象

  • 问题内容: 你好(对不起我的英语) 我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @compone

  • 我试图调用一个restendpoint,它返回一个pojo对象,如下所示: 以下是电话: 问题是我已经尝试了一些方法,例如忽略 OffsetDateTime 属性或尝试更改该日期的格式,但它会引发此错误: 否则它将返回空:(解决这个问题的好解决方案是什么?