Serializable UID一致性问题

本文探讨了Java对象序列化时类必须实现Serializable接口,并解释了UID(streamuniqueidentifier)作为类唯一标志的重要性。特别强调了在分布式场景下保持UID一致性以避免序列化失败的关键性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应该都在知道,当我们要将java对象存在在本地,或者从本地读取到内存中该对象的类必须实现serializable接口,其实该接口中没有任何方法的声明看,只是作为一个可被jvm特殊处理的标志,每一个实现该接口的类都有一个UID(stream unique identifier )作为该类的唯一标志,这个UID是通过类名、方法名等诸多因素计算出来的,它和该类是一一对应的关系。如若UID不对应那么就无法实现反序列化了。会出现如下异常

java.io.InvalidClassException: com.java.model.User; local class incompatible: stream classdesc 
serialVersionUID = -405990810656876143, local class serialVersionUID = 875403040358241326

 

由上面可知,当我向本地序列化对象之后,尽量不要 已经被序列化的类中添加或者删除相关字段或者方法 ,如若必须要改动则需重新进行序列化操作。

 

另一种情况容易出现UID不一致的情况就是在做分布式的时候,由于UID在没有指定的时候是jvm根据类的相关属性自动生成的,所以选择相同的jvm是前提,所以在做分布式的时候尽量要选取相同的jvm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值