• Java的序列化和反序列化


    序列化和反序列化

    • 序列化:把对象转换为字节序列的过程称为对象的序列化.

    • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化.

    什么时候需要用到序列化和反序列化呢?

    当我们只在本地 JVM 里运行下 Java 实例, 这个时候是不需要什么序列化和反序列化的, 但当我们需要将内存中的对象持久化到磁盘, 数据库中时, 当我们需要与浏览器进行交互时, 当我们需要实现 RPC 时, 这个时候就需要序列化和反序列化了.

    也就是说只要我们对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化.

    实现序列化和反序列化为什么要实现 Serializable 接口和显示指定 serialVersionUID 的值?

    在 Java 中实现了 Serializable 接口后, JVM就会在底层帮我们实现序列化和反序列化,

    如果不显示指定 serialVersionUID, JVM 在序列化时会根据属性自动生成一个 serialVersionUID, 然后与属性一起序列化, 再进行持久化或网络传输. 在反序列化时, JVM 会再根据属性自动生成一个新版 serialVersionUID, 然后将这个新版 serialVersionUID 与序列化时生成的旧版 serialVersionUID 进行比较, 如果相同则反序列化成功, 否则报错.

    如果显示指定了 serialVersionUID, JVM 在序列化和反序列化时仍然都会生成一serialVersionUID, 但值为我们显示指定的值, 这样在反序列化时新旧版本的 serialVersionUID 就一致了.

    不显示指定 serialVersionUID 的情况会导致什么问题?

    如果我们的类写完后不再修改, 那当然不会有问题, 但这在实际开发中是不可能的, 我们的类会不断迭代, 一旦类被修改了, 那旧对象反序列化就会报错. 所以在实际开发中, 我们都会显示指定一个 serialVersionUID, 值是多少无所谓, 只要不变就行.

    Java 序列化的其他特性

     被 transient 关键字修饰的属性不会被序列化, static 属性也不会被序列化.因为序列化是针对对象而言的, 而 static 属性优先于对象存在, 随着类的加载而加载, 所以不会被序列化.

  • 相关阅读:
    软件测试为什么这么“火”,是不是被“炒作”起来的?
    媒体行业的3D建模:在影视中创造特效纹理
    最靠谱的nvm安装教程 for mac
    Qt 键盘事件
    elasticsearch数据备份与恢复(kibana操作)
    php使用lunar实现农历、阳历、节日等功能
    前后端交互—Express
    Java内码编码之UTF-16讲解 [Java][编码]
    MySQL之高可用性和应用层优化(一)
    项目立项管理
  • 原文地址:https://blog.csdn.net/qq_53916344/article/details/126547527