Java 类的自定义序列化失败

Java 类的自定义序列化失败,java,serialization,deserialization,Java,Serialization,Deserialization,我有一个类,用于存储有关文件(路径等)的信息。当我想将文件和其他信息发送给其他人时,我只序列化该类 对于大于1019字节的文件,我有一个问题:它们的存储方式不正确 我能够用这个示例类重新创建问题: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import j

我有一个类,用于存储有关文件(路径等)的信息。当我想将文件和其他信息发送给其他人时,我只序列化该类

对于大于1019字节的文件,我有一个问题:它们的存储方式不正确

我能够用这个示例类重新创建问题:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerializableImage implements Serializable{
    private static final long serialVersionUID = -2079629440538093893L;
    private String path;
    private byte[] data;


    public SerializableImage()
    {}

    public SerializableImage(String path) {
        this.path = path;
    }

    public byte[] getData() {
        return data;
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        int imageSize = ois.readInt();
        data = new byte[imageSize];
        ois.read(data);
    }

    private void writeObject(ObjectOutputStream oos) throws IOException {
        int imageSize;
        File file = new File(path);
        imageSize = (int) file.length();
        oos.writeInt(imageSize);
        InputStream is = null;
        byte[] buffer = new byte[imageSize];

        try {
            is = new FileInputStream(file);
            is.read(buffer);
        } finally {
            if (is != null) {
                is.close();
            }
        }

        oos.write(buffer);
    }
}
属性imageSize是以正确的方式写入的,字节也是以正确的方式读取到缓冲区的(与“文件克隆”相比,它只有一个FileInputStream和一个FileOutputStream,因此我知道写入缓冲区字节数组的信息是正确的)

现在的问题是: oos.write(缓冲区)有问题吗? 或者是ois.read(数据)中的问题? imageSize的写入/读取方式正确

从索引1020开始,数据字节数组中的值总是错误的

我用以下代码“测试”了这个类:

    SerializableImage sourceImage = new SerializableImage("C:\\\\source.jpg");
    File serializableData = new File("C:\\\\data.data");
    File targetImage = new File("C:\\\\target.jpg");

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serializableData));
    oos.writeObject(sourceImage);

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serializableData));

    sourceImage = (SerializableImage) ois.readObject();
    FileOutputStream imageOutputStream = new FileOutputStream(targetImage);

    byte[] data = sourceImage.getData();
    imageOutputStream.write(data);
    imageOutputStream.flush();
    ois.close();
    oos.close();
    imageOutputStream.close();

有什么明显的东西我没认出吗?我没有收到错误消息或其他什么。注意这一点的唯一方法是目标图像无效。

正如Robert在问题writeObject下的注释中所述,在处理ObjectOutputStream时,应始终使用writeObject。写入(字节[]数据)也将接受字节数组。使用readObject和read进行读取也是如此。

writeObject
中读取文件对我来说似乎很奇怪,特别是考虑到您有一个无参数构造函数,并且
路径可能是
null
。您也不会从
read
中检查返回值。表示“任何对象,包括字符串和数组,都是用writeObject编写的。”--您是否尝试过readObject`and
writeObject
而不是简单的
read
write
方法?为什么还要有自己的
readObject
writeObject
方法呢?这只是一个类来说明我是如何解决这个问题的——关于null等的所有内容在这一点上都不重要,因为这只是一个重现它的示例。这同样适用于不检查读取返回值。当然,我是在我的“真实”课堂上做的。我将在再次进入计算机后立即检查writeObject点。在尝试读取oos流之前,您应该关闭oos流,它不能保证已刷新到磁盘。