• private static final long serialVersionUID = 1L的作用是什么?


    1.作用是什么?

    • 当一个类被序列化后,存储在文件或通过网络传输时,这些序列化数据会包含该类的结构信息。当反序列化操作发生时,Java虚拟机会根据序列化数据中的结构信息来还原对象。

    • 但是,如果在序列化之后,对类的结构进行了修改,例如添加或删除了字段、修改了继承关系等,那么旧版本的序列化数据可能无法正确地还原为新版本的类对象。这样就会导致反序列化失败,抛出异常。

    • 为了解决这个问题,Java提供了serialVersionUID这个变量。它是一个唯一标识符,用于标识一个类的版本。当一个类被序列化时,serialVersionUID会被写入序列化数据中。

    • 在反序列化过程中,Java虚拟机会将序列化数据中的serialVersionUID与当前类的serialVersionUID进行比较。如果两者不匹配,说明类的版本发生了变化,就会抛出InvalidClassException异常,阻止反序列化操作。

    • 因此,添加serialVersionUID的作用是确保在类的版本发生变化时,仍然能够正确地进行反序列化操作。通过显式指定serialVersionUID,可以避免由于类的结构变化而引起的反序列化异常。

    2.那如果我修改类的结构之后serialVersionUID还和原来的一样不就还能继续反序列化吗?

    • 如果修改了类的结构但是serialVersionUID保持不变,那么反序列化操作仍然可以成功。

    • 在进行反序列化操作时,Java虚拟机会比较序列化数据中的serialVersionUID与当前类的serialVersionUID是否相同。如果相同,说明类的版本匹配,可以继续反序列化操作。

    • 这种情况下,虽然类的结构发生了变化,但是由于serialVersionUID没有改变,所以虚拟机认为这两个版本是兼容的,可以安全地还原对象。

    • 需要注意的是,尽管反序列化操作可以成功,但是可能会导致一些意料之外的结果。例如,如果新版本的类删除了某个字段,而旧版本的序列化数据中仍然包含该字段的值,那么反序列化后,该字段的值将丢失。

    • 因此,在修改类结构后,建议更新serialVersionUID的值,以确保在版本不兼容的情况下能够抛出异常,避免潜在的错误和数据丢失。

  • 相关阅读:
    SQL优化 第一章
    FMEA:总监和架构师都在用的高可用架构分析方法
    【大型电商项目开发】性能压测-压力测试基本概念&JMeter-38
    mybatisPlus条件构造器常用方法
    解决jsp/html界面跳转servlet出现404错误的方法
    在线问诊 Python、FastAPI、Neo4j — 创建症状节点
    用Redis实现延迟队列,我研究了两种方案,发现并不简单
    建立TCP连接后发送窗口, 接收窗口, 拥塞窗口的变化情况
    Linux性能优化实践(1): 进程长时间不被调度执行案例
    Chiitoitsu
  • 原文地址:https://blog.csdn.net/youngerxsd/article/details/133470808