You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用StreamingResponseBody传输对象遇StreamCorruptedException问题求助

解决java.io.StreamCorruptedException及二进制传输字节不一致问题

核心问题分析

  • Content-Type不匹配:发送端实际传输的是Java序列化的二进制字节流,但设置了APPLICATION_STREAM_JSON类型,HTTP传输层会将其当作文本流处理,触发字符编码转换,直接破坏原始二进制数据。
  • 错误的响应接收逻辑:接收端用String.class接收二进制响应,再转成byte[],这一步会因为字符编码(如默认UTF-8)无法还原原始二进制字节,导致反序列化时出现无效流头。
  • 多对象序列化边界问题:发送端循环写入多个独立序列化的Student字节数组,接收端却尝试反序列化成单个对象,无法识别多个对象的流边界,后续数据无法解析。
  • 代码笔误:接收端存在HttpHeadres拼写错误,强转时Students应为Student。

修复步骤

1. 修正发送端的Content-Type与序列化逻辑

将响应类型改为二进制流专用的APPLICATION_OCTET_STREAM,同时直接序列化整个List而非单个对象循环写入(避免流边界问题):

@GetMapping(value="/send")
public ResponseEntity<StreamingResponseBody> send(){
    List<Student> students = studentManager.getStudents();

    StreamingResponseBody stream = outputStream -> {
        byte[] data = SerializationUtils.serialize(students);
        outputStream.write(data);
        outputStream.flush();
    };

    return ResponseEntity.ok()
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(stream);
}

2. 修正接收端的响应接收方式

直接接收二进制字节数组,跳过String中转环节,避免编码损坏:

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_OCTET_STREAM));

HttpEntity<Object> entity = new HttpEntity<>(null, headers);
ResponseEntity<byte[]> response = restTemplate.exchange(
        "http://localhost:8080/send", 
        HttpMethod.GET, 
        entity, 
        byte[].class
);

byte[] bytes = response.getBody();
List<Student> students = (List<Student>) SerializationUtils.deserialize(bytes);

3. 修正代码笔误

  • 将HttpHeadres改为HttpHeaders
  • 若保留单个对象传输逻辑,需将强转代码(Students)o改为(Student)o

内容的提问来源于stack exchange,提问作者Amadis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:55:29