使用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
相关产品推荐
相关产品推荐

