Java 当我尝试读取外部文件时,为什么readObject挂起?

Java 当我尝试读取外部文件时,为什么readObject挂起?,java,serialization,Java,Serialization,我有一个我已经序列化的类(“Player”)(getters和setters省略以保持简短) 长话短说,我能够将对象的所有组件读写到硬盘上的文件中,阵列中包含的图像除外。执行下面的“readObject”代码时,系统挂起。(但是,据我所知,可能“writeObject”代码没有按我认为的方式工作) 我已经用字符串、int和独立图像尝试了这段代码,它很有效 我在这里研究了一些解决方案,但所有问题都指向通过网络而不是保存的文件使用这两种方法 我错过了什么?如果有帮助的话,我还提供了下面的包装器组件

我有一个我已经序列化的类(“Player”)(getters和setters省略以保持简短)

长话短说,我能够将对象的所有组件读写到硬盘上的文件中,阵列中包含的图像除外。执行下面的“readObject”代码时,系统挂起。(但是,据我所知,可能“writeObject”代码没有按我认为的方式工作)

我已经用字符串、int和独立图像尝试了这段代码,它很有效

我在这里研究了一些解决方案,但所有问题都指向通过网络而不是保存的文件使用这两种方法

我错过了什么?如果有帮助的话,我还提供了下面的包装器组件

更新:在“readObject”中打印“count”的值会得到一个大得离谱的数字,这可能解释了它挂起的原因(请参阅下面的代码)。但我不明白的是,为什么它读的不是它保存的同一个数字

public class Player implements Serializable {
    private static final long serialVersionUID = -8193759868470009555L;
    private String someString = "";
    private int someInt = 0;
    private transient BufferedImage image = null;
    private transient ArrayList<BufferedImage> imageArray = new ArrayList<BufferedImage>();

    private void writeObject(ObjectOutputStream oos){
        oos.defaultWriteObject();

        // Image
        ImageIO.write(image, "png", oos);

        // Number of images in array
        oos.writeInt(imageArray.size());
        for (BufferedImage image: imageArray){
            ImageIO.write(image, "png", oos);
        }
    }

    private void readObject(ObjectInputStream ois){
        ois.defaultReadObject();

        // Image
        this.image = ImageIO.read(ois);

        // Number of images in array
        imageArray = new ArrayList<BufferedImage>();
        int count = ois.readInt();

                           //****** count = 415301485
        for (int i=0; i<count; i++){
            imageArray.add(ImageIO.read(ois));
        }
    }
}

ois.readInt()
的意外结果清楚地表明序列化和反序列化实现不同步

我猜这是因为
ImageIO.read()
实际上读取的字节数超过了解码图像所需的字节数

尝试使用图像数据的实际长度预先添加图像数据:

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ImageIO.write(image, "png", buffer);
oos.writeInt(buffer.size());
oos.write(buffer.toByteArray());
并使用它只向
ImageIO.read()
提供有限的流块:


你调试过了吗?该方法有几行-你知道哪一行挂起吗?它可能会递归吗?好的,这似乎有效,但为什么?您可能认为它会读取与最初写入的数据相同的数据。我认为
ImageIO.read()
使用某种缓冲区从流中读取字节,当实际图像数据结束时,一些字节仍保留在该缓冲区中。
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ImageIO.write(image, "png", buffer);
oos.writeInt(buffer.size());
oos.write(buffer.toByteArray());
int imageLength = ois.readInt();
byte[] buffer = new byte[imageLength];
ois.read(buffer);
this.image = ImageIO.read(new ByteArrayInputStream(buffer));