• 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的值,以确保在版本不兼容的情况下能够抛出异常,避免潜在的错误和数据丢失。

  • 相关阅读:
    JavaScript-ECMAScript编程
    html引入js相对路径时遇到了一个问题,应该是vs code的提示bug
    1.shell命令入门
    猿创征文|【JavaSE】Java概述与配置问题解决
    密码学系列之:PKI的证书格式表示X.509
    1920: 【C2】【字符串】调换位置
    HittER: Hierarchical Transformers for Knowledge Graph Embeddings
    【Redis】Redis最佳实践:键值设计
    feign之间相互通信RequestInterceptor拦截器失效
    2022北京营养健康展会/北京健康生活展/北京养生健康展会
  • 原文地址:https://blog.csdn.net/youngerxsd/article/details/133470808