J_Silver 2024-04-28 16:13 采纳率: 0%
浏览 4

java BIO对象流传输问题

经过我自定义的输出流,

public class MyObjectOutputStream extends ObjectOutputStream {

    public MyObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    @Override
    protected void writeStreamHeader() throws IOException {

    }
}

客户端在执行以下方法后,

private void sendAudioFile(MyObjectOutputStream objectOutputStream, byte[] audioData) throws IOException {
        Map.Entry<String, byte[]> entry = new AbstractMap.SimpleEntry<>(name, audioData);
        objectOutputStream.writeObject(entry);
        objectOutputStream.flush();
    }

服务端执行如下方法接收,

public Object readMessage(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
        return objectInputStream.readObject();
    }

当服务端执行转发给另一个客户端,该客户端在接收时报错:
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')
at uiChat.client.ClientReadThread.run(ClientReadThread.java:38)------------->return objectInputStream.readObject();

为什么服务端接收不报错,且能正确接收,而客户端却无法接收?

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-04-28 16:13
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题的目的是解决在使用Java的BIO对象流进行数据传输时,客户端接收数据时出现的ClassCastException异常。

    问题出现原因

    从提供的代码和错误信息来看,问题可能出现在以下几个方面:

    1. 自定义的MyObjectOutputStream:在自定义的MyObjectOutputStream中,重写了writeStreamHeader()方法,但没有实现任何逻辑。这可能导致对象流的头部信息没有正确写入,从而影响到后续的序列化过程。
    2. 客户端和服务端的类版本不匹配:客户端和服务端可能使用了不同版本的Java类库,导致反序列化时类定义不匹配。
    3. 类加载器问题:错误信息表明,java.io.ObjectStreamClass无法转换为java.lang.String,这可能是因为客户端和服务端使用了不同的类加载器。

    问题解决方案

    1. 确保writeStreamHeader()方法正确实现:在自定义的MyObjectOutputStream中,应该实现writeStreamHeader()方法,确保对象流的头部信息正确写入。
    2. 使用相同的Java版本:确保客户端和服务端使用相同的Java版本和类库。
    3. 避免使用不同类加载器:确保客户端和服务端使用相同的类加载器,或者至少确保它们能够正确处理跨类加载器的序列化对象。

    提供代码

    以下是修改后的MyObjectOutputStream类,它正确实现了writeStreamHeader()方法:

    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    
    public class MyObjectOutputStream extends ObjectOutputStream {
    
        public MyObjectOutputStream(OutputStream out) throws IOException {
            super(out);
            writeStreamHeader(); // 确保调用父类的writeStreamHeader()方法
        }
    
        @Override
        protected void writeStreamHeader() throws IOException {
            super.writeStreamHeader(); // 使用父类的方法来写入流头部信息
        }
    }
    

    代码运行方式

    1. 将上述修改后的MyObjectOutputStream类替换到你的项目中。
    2. 确保客户端和服务端使用相同的Java版本和类库。
    3. 运行客户端和服务端程序,进行对象传输。

    代码预期运行结果

    预期结果是客户端和服务端能够正确地传输和接收对象,不会出现ClassCastException异常。

    推荐相关链接

    请注意,这些链接提供了关于Java序列化、ClassCastException和类加载器的官方文档,可以帮助你更深入地理解这些问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月28日