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

  • 相关阅读:
    [TS基础]开发环境,类型的声明
    Go 语言学习总结(10)—— Go 初学者必知的十个命令
    数据宝非营运货车保险风险评估产品成功入围泰康保险采购库!
    RocketMQ源码(二十一)之延迟消息
    ESP32使用MiroPython编程环境搭建
    【区块链 + 智慧政务】一体化政务数据底座平台 | FISCO BCOS应用案例
    TCP/IP网络协议详解
    React高频面试题(附答案)
    error: invalid path ‘drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c‘
    【大数据+爬虫+可视化】基于Python的房价数据分析系统
  • 原文地址:https://blog.csdn.net/youngerxsd/article/details/133470808