类的自定义序列化失败

时间:2016-11-08 23:38:56

标签: 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 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();

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

1 个答案:

答案 0 :(得分:0)

正如Robert在问题中的注释中所述,在使用ObjectOutputStream时,应始终使用writeObject。 write(byte [] data)也会加入一个字节数组。使用readObject和read进行读取也是如此。