问题场景:
在项目中,我试图使用 Java 的 ObjectInputStream 反序列化一个对象。代码逻辑看似简单:读取字节流,将其转为 Java 对象。然而,程序抛出了以下异常:
java.io.StreamCorruptedException: invalid stream header: 48656C6C
逐步分析问题
1. 分析异常信息,提取关键点
错误提示中明确指出了“invalid stream header”,这表明反序列化时 ObjectInputStream 读取到的数据流头部不符合 Java 序列化对象的预期格式。
- Java 的序列化对象头部有固定的标识符:
通常是 AC ED(十六进制),也就是 Java 标准序列化协议的魔数。 - 如果读取到的数据头部是 48656C6C,明显与 Java 序列化格式不符,因此必须检查这个数据的实际内容。
2. 通过数据流头部快速判断类型
数据流头部通常可以透露它的来源或格式。例如:
- 48656C6C 是十六进制,转换成 ASCII 是 Hell,可能是普通文本的一部分。
- 如果是 JSON,通常以 { 或 [ 开头。
- 如果是 XML,则可能以 < 开头。
- 如果是其他二进制协议(如 Protobuf、Thrift),可能有专用的魔数。
3. 十六进制转为字符更直观
通过将 48656C6C 解析为 ASCII,我们发现它对应的是 “Hell”,推测这是人类可读的文本格式,而不是 Java 序列化数据。结合上下文,这表明数据来源可能是某种误操作(例如,将普通文本传给了期望接收 Java 序列化对象的输入流)。
遇到类似问题的处理思路
1. 分析异常信息
- 关注异常类名和具体描述:
- StreamCorruptedExcepti

最低0.47元/天 解锁文章
6007

被折叠的 条评论
为什么被折叠?



