Java 在文件中写入/读取一系列不同的序列化对象

Java 在文件中写入/读取一系列不同的序列化对象,java,image,file,serialization,read-write,Java,Image,File,Serialization,Read Write,我有一个对象集合: Map<BufferedImage, Map<ImageTransform, Set<Point>>> map 以下是我如何读取文件中的: ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); while(true) { try { BufferedImage image = ImageIO.

我有一个对象集合:

Map<BufferedImage, Map<ImageTransform, Set<Point>>> map
以下是我如何读取文件中的

    ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
    while(true) {
        try {
            BufferedImage image = ImageIO.read(in);
            Map<ImageTransform, Set<Point>> value = 
                (Map<ImageTransform, Set<Point>>) in.readObject(); // marker
            map.put(image, value);
        } catch (IOException ioe) {
            break;
        }
    }

我的问题是,首先,写作概念正确吗?
ImageIO#write
是否适合这种情况,还是应该考虑使用/存储
BufferedImage#getRgb
int[]
数组?数组是否更紧凑(如中所示,占用的文件空间更少)?
其次,我应该如何从文件中读回对象?我如何知道何时达到EOF?为什么上述方法不起作用

我希望提供的信息足够多,如果您需要更多信息,请告诉我。

提前谢谢

一种“欺骗”且只有一个对象可序列化的方法是将对象组添加到可扩展的可序列化列表中。然后序列化列表

顺便说一句,我倾向于在序列化对象上使用
XMLEncoder
,因为它们可以在以后的JVM中恢复。对于序列化对象没有这样的保证



@Ivan c00kiemon5ter V Kanak:“我正试图使文件尽可能小

考虑到磁盘空间非常便宜,这通常是白费力气

*…所以我想序列化更好*

不要猜测,要测量

…我会尝试使用列表,看看结果如何

酷。请注意,如果使用
XMLEncoder
,我建议在大多数情况下对其进行压缩。这将减少XML的文件大小。这种情况在存储图像时有所不同


图像格式通常包含一种类型的压缩,这种压缩不利于通过Zip进一步压缩。这可以通过将压缩的XML和图像作为“原始”存储在Zip中的单独条目来实现。OTOH我认为您会发现,仅压缩XML所节省的字节量是不值得的,因为图像条目的最终文件大小。

它不能作为ObjectOutputStream和ObjectInputStream写入/预期在您无序写入图像时违反的特定文件格式。要成功使用ObjectStreams,您需要遵守ObjectStreams指定的约定

为此,您需要创建一个保持类,并将该类用作映射的键,而不是BuffereImage。该保持类应实现Serializable和three方法(不在任何实际接口中)在读写过程中将类标记为需要特殊处理。方法签名必须与指定的完全一致,否则序列化将无法工作

有关更多信息,请查看on ObjectOutputStream

public class ImageHolder implements Serializable {

    BufferedImage image;

    public ImageHolder(BufferedImage image) {
        this.image = image;
    }

    private void readObject(ObjectInputStream stream) 
            throws IOException, ClassNotFoundException {
        image = ImageIO.read(stream);
    }

    private void writeObject(ObjectOutputStream stream) 
            throws IOException {
        ImageIO.write(image, "PNG", stream);
    }

    private void readObjectNoData() throws ObjectStreamException {
        // leave image as null
    }

然后序列化应该像
outputStream.writeObject(map)一样简单
。不过您需要检查ImageTransform的实现类是否也可序列化。

我正在尝试使文件尽可能小,因此我想序列化更好。我将尝试使用列表,看看效果如何。谢谢不要猜测。度量。我希望:)我将度量。我希望最小化space,因为我正在开发一个压缩系统。所以,我应该注意存储什么,不存储什么。正如我所说的,我将研究
XMLEncoder
,进行一些测试,并在此过程中学习一些新东西。“OOS不能很好地处理多个对象”呃?不要告诉RMI。当然可以。您可以编写尽可能多的对象你喜欢一个ObjectOutputStream,然后把它们读回来,直到你得到EOFEException。是的,我想到了这一点,我很想好好看看。我认为它足够干净,如果我成功的话,它是一个非常好的解决方案。谢谢。
java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1300)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
public class ImageHolder implements Serializable {

    BufferedImage image;

    public ImageHolder(BufferedImage image) {
        this.image = image;
    }

    private void readObject(ObjectInputStream stream) 
            throws IOException, ClassNotFoundException {
        image = ImageIO.read(stream);
    }

    private void writeObject(ObjectOutputStream stream) 
            throws IOException {
        ImageIO.write(image, "PNG", stream);
    }

    private void readObjectNoData() throws ObjectStreamException {
        // leave image as null
    }