引自免费微信小程序:皆我百晓生
在Java中,readObject() 方法会读取序列化后的对象,并尝试将其转换为指定的类。在这个例子中,它试图将一个对象转换成 String 类型,但实际读取到的对象是 ObjectStreamClass 类型,这导致了 ClassCastException。这是因为你在调用 readObject() 时,没有正确地指明期望读取的类型。
要解决这个问题,你需要确保在读取数据时,提供的类型与序列化的对象类型匹配。由于你提到是在读取 Map.Entry<String, byte[]> 类型,你需要创建一个 Map.Entry 的实例并使用其对应的泛型类型来读取。
这里是修复后的代码示例:
import java.io.*;
import java.util.*;
public class ObjectStreamExample {
public static void main(String[] args) {
// 假设你已经有了一个已经写入对象的ObjectOutputStream
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream("test.ser");
oos = new ObjectOutputStream(fos);
Map.Entry<String, byte[]> entry = new SimpleEntry<>("key", new byte[]{1, 2, 3});
oos.writeObject(entry);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 现在开始从文件中读取对象
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream("test.ser");
ois = new ObjectInputStream(fis);
while (ois.available() > 0) {
// 使用Map.Entry作为目标类型进行读取
Map.Entry<String, byte[]> readEntry = (Map.Entry<String, byte[]>) ois.readObject();
System.out.println("Key: " + readEntry.getKey());
System.out.println("Value: " + Arrays.toString(readEntry.getValue()));
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
这段代码首先创建了一个 SimpleEntry(这是 Map.Entry 的实现)并将之序列化到文件中。然后,在读取阶段,我们使用了 Map.Entry<String, byte[]> 类型来读取对象,这样就不会抛出 ClassCastException 了。
注意:这里假设你已经有一个实现了 Serializable 接口的 SimpleEntry 类,如果没有,你需要创建一个或者替换为你项目中的相应实现。同时,available() 方法用来检查输入流中是否有可用的数据,但不建议用于判断是否读取完毕,因为它可能返回非零值即使输入流已经结束。在实际应用中,通常会使用循环结构,当读取到 null 或者其他终止条件时退出循环。