Java-序列化serialVersionUID不一致处理

文章目录背景serialVersionUID不一致的兼容处理背景Java Object Serialization 会使用对象中的serialVersionUID私有静态常量长整型属性(private static final long)作为该对象的版本号,反序列化时 JVM 会校验该版本号是否和序列化时的一致,如果不一致会导致序列化失败,抛出InvalidClassException异常。默认情况下,JVM 为每一个实现了Serializable的接口的类生成一个serialVersionUID,
摘要由CSDN通过智能技术生成

背景

Java Object Serialization 会使用对象中的serialVersionUID私有静态常量长整型属性(private static final long)作为该对象的版本号,反序列化时 JVM 会校验该版本号是否和序列化时的一致,如果不一致会导致序列化失败,抛出InvalidClassException异常。

截图

默认情况下,JVM 为每一个实现了Serializable的接口的类生成一个serialVersionUID,这个版本ID的计算规则是通过当前类信息(类名、属性、方法、修饰符等)生成的,所以当属性有变更时这个serialVersionUID也一定会发生变更(简单新增空行、空格并不会影响serialVersionUID生成)。

这个serialVersionUID的生成,和所使用的JDK有关,不同的JDK可能会生成不一样的版本ID。

而且考虑到实际业务场景,变更属性修改类是常有的事,如果使用自动生成的版本ID很容易造成serialVersionUID不一致的问题,导致反序列化失败。

所以最好是手动显示生成,大多数 JAVA IDE 都会提供自动生成版本ID的功能。

serialVersionUID不一致的兼容处理

普通序列化(Serialization) 和 反序列化(Deserialization):

public class SerializeTest {
   

    public static void main(String[] args) throws Exception {
   
        // Serialize to a file.
        FileOutputStream f = new FileOutputStream("./tmp");
        ObjectOutput s = new ObjectOutputStream(f);
        s.writeObject("Today");
        s.writeObject(new Person());
        s.flush();

        
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值