J_Silver 2024-04-28 13:25 采纳率: 0%
浏览 2

java对象流传递问题

Exception in thread "Thread-2" java.lang.ClassCastException: class java.io.ObjectStreamClass cannot be cast to class java.lang.String (java.io.ObjectStreamClass and java.lang.String are in module java.base of loader 'bootstrap')
报错发生于


return objectInputStream.readObject();

接收端读取Map.Entry<String,byte[]>类型时产生。

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-28 13:25
    关注

    引自免费微信小程序:皆我百晓生

    在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 或者其他终止条件时退出循环。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月28日