Java 类的自定义序列化失败
我有一个类,用于存储有关文件(路径等)的信息。当我想将文件和其他信息发送给其他人时,我只序列化该类 对于大于1019字节的文件,我有一个问题:它们的存储方式不正确 我能够用这个示例类重新创建问题: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
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`andwriteObject
而不是简单的read
和write
方法?为什么还要有自己的readObject
和writeObject
方法呢?这只是一个类来说明我是如何解决这个问题的——关于null等的所有内容在这一点上都不重要,因为这只是一个重现它的示例。这同样适用于不检查读取返回值。当然,我是在我的“真实”课堂上做的。我将在再次进入计算机后立即检查writeObject点。在尝试读取oos流之前,您应该关闭oos流,它不能保证已刷新到磁盘。