跨服务器场景下接收端JVM反序列化时如何获取序列化用的serialuuid
Java反序列化时接收端JVM获取serialVersionUID的机制
- 发送端使用
ObjectOutputStream完成序列化时,生成的二进制序列化流中会自带目标类的元数据信息,其中就包含该类的serialVersionUID值:若发送端的对应类显式声明了
serialVersionUID静态常量,就直接将该常量值写入流;若未显式声明,JVM会在序列化阶段根据类的全限定名、实现的接口、所有成员字段与方法的签名等特征自动计算生成一个默认的serialVersionUID,一同写入序列化流。 - 接收端调用
ObjectInputStream执行反序列化时,首先会解析序列化流的元数据区块,直接从中提取出发送端写入的serialVersionUID值。 - 后续JVM会将提取到的发送端serialVersionUID,和接收端本地加载的同全限定名类的serialVersionUID做一致性校验,校验通过才会完成后续的反序列化操作,否则会抛出
InvalidClassException异常。
注意:实际开发中推荐为所有需要序列化的类显式声明固定的serialVersionUID值,避免不同JVM环境自动计算的默认serialVersionUID不一致,导致跨节点反序列化失败。
内容的提问来源于stack exchange,提问作者aswathy
相关产品推荐
相关产品推荐

