当前位置: 首页 > news >正文

36.Java序列化与反序列化是什么

36.Java序列化与反序列化是什么

  • 序列化就是把Java对象转换成字节流(二进制)。
    • 把对象保存到本地文件或网络传输。因为Java对象在JVM的堆内存中,JVM堆不存在了,对象也就不在了。
  • 反序列化就是把字节流转换为对象
    • 从文件或者网络里获取字节流,通过反序列化就可以重建对象

为什么需要序列化与反序列化?

进行持久化或者网络传输时需要序列化与反序列化。

跨平台和跨语言通信,序列化为二进制文件,可以在不同平台和语言解析。

Java对象序列化不仅仅保留一个对象的数据,也会递归保留对象引用的每个对象的数据

序列化实现的方式有哪些?

  • 实现serializable接口或者Externalizable接口

    • Serializable接口

      • 特点:

        • 简单易用:只需实现接口即可。
        • 默认行为:自动序列化所有非 transient 和非静态字段。
        • 版本控制:通过 serialVersionUID 控制类版本兼容性。
      • 缺点:

        • 性能较差:生成的字节流较大,效率较低。
        • 跨语言不兼容:只能用于 Java 系统内部。
        • 安全性问题:反序列化不可信数据可能导致漏洞。
      • public class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;// 构造方法、getter/setter
        }// 序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"));
        oos.writeObject(new Person("Alice", 30));// 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"));
        Person person = (Person) ois.readObject();
        
    • 自定义序列化(Externalizable 接口)

      • 特点:

        • 完全控制序列化逻辑:可选择性地序列化字段。
        • 更灵活:适合需要优化存储或传输效率的场景。
      • 缺点:

        • 开发成本高:需要手动编写序列化/反序列化逻辑。
      • public class Person implements Externalizable {private String name;private int age;@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeUTF(name);out.writeInt(age);}@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {name = in.readUTF();age = in.readInt();}
        }
        

在这里插入图片描述

什么是serialVersionUID

用来表示类的不同版本的兼容性。

来验证版本是否一致,JVM在反序列化时,拿到传过来的字节码文件,用字节码文件的UID去和本地的类文件的UID去比对,如果一致就会进行反序列化。

为什么还要显示指定serialVersionUID的值

  • 如果不显示指定,JVM就会在反序列化时新生成一个UID去和本地类的UID去对比
  • 如果显示指定了,JVM任然会去生成UID,但是UID值是我们显示指定的值,会去和本地的显示指定的UID去对比,这样旧和新的UID都是一致的,是我们显示指定的。
  • 在实际开发中,编写的类会一直不断迭代,如果修改了类,UID就会改变,所以我们显示指定一个UID,保持UID一致。

serialVersionUID什么时候修改?

序列化类新增属性时,不要修改UID,避免反序列化失败。如果完全不兼容升级,避免反序列化混乱,修改UID。

Java 序列化中如果有些字段不想进行序列化,怎么办?

对于不想进行序列化的变量,使用 transient 关键字修饰。transient只能修饰变量,不能修饰类和方法。反序列化后,transient修饰的值会设为初始值,如int类型就会为0,对象类型就会为null。

静态变量会被序列化吗?

sient 关键字修饰。transient只能修饰变量,不能修饰类和方法。反序列化后,transient修饰的值会设为初始值,如int类型就会为0,对象类型就会为null。

静态变量会被序列化吗?

不会,因为序列化是针对对象而言的,而静态变量会随着类的加载而加载,优先于对象存在。serialVersionUID也被static修饰, 为什么serialVersionUID会被序列化?其实serialVersionUID属性并没有被序列化, JVM在序列化对象时会自动生成一个serialVersionUID, 然后将我们显示指定的serialVersionUID属性值赋给自动生成的serialVersionUID。


文章转载自:

http://WVYKI5rF.cknsx.cn
http://PomtbMv9.cknsx.cn
http://0VCltHZz.cknsx.cn
http://587ZGgZK.cknsx.cn
http://dI4OPssI.cknsx.cn
http://TSWnwkSU.cknsx.cn
http://tD2U1ipN.cknsx.cn
http://1lrZDze3.cknsx.cn
http://qLfyhMhu.cknsx.cn
http://j1cerrg3.cknsx.cn
http://wVmkqemp.cknsx.cn
http://Ajxz4hH9.cknsx.cn
http://lgLEW8DF.cknsx.cn
http://gnQpes7P.cknsx.cn
http://bcT5VYeB.cknsx.cn
http://JMCE8z03.cknsx.cn
http://ykTbRgqH.cknsx.cn
http://h15CA40m.cknsx.cn
http://1YTgDnvm.cknsx.cn
http://xAMMDyK4.cknsx.cn
http://Rn4sgkx3.cknsx.cn
http://ommghucD.cknsx.cn
http://UgbBICNN.cknsx.cn
http://tPNhnE1g.cknsx.cn
http://0Ovcp5al.cknsx.cn
http://cKliq4mP.cknsx.cn
http://O64ESc7y.cknsx.cn
http://HUpnzfe6.cknsx.cn
http://9iAqxp19.cknsx.cn
http://BXINav5s.cknsx.cn
http://www.dtcms.com/a/372799.html

相关文章:

  • 进阶向:HTTP性能优化实战
  • 对计算机网络模型的理解
  • 【Linux】MySQL数据目录迁移步骤(含流程图踩坑经验)
  • LangChain: Evaluation(评估)
  • 在电路浪涌测试中,TVS(瞬态电压抑制二极管)的防护效果确实会受到陪测设备中去耦网络(Decoupling Network,DN)的显著影响
  • 深入了解linux系统—— 日志
  • 3D开发工具HOOPS助力造船业数字化转型,打造更高效、更智能的船舶设计与协作!
  • 大语言模型时代文本水印技术的综述解读
  • 《WINDOWS 环境下32位汇编语言程序设计》第13章 过程控制(2)
  • 1. 统计推断-基于神经网络与Langevin扩散的自适应潜变量建模与优化
  • STM32U575RIT6 简单代码(参考模板)
  • 在新发布的AI论文中 pytorch 和tensorflow 的使用比例
  • Chapter3—单例模式
  • k8s可视化的解决方案及技术选型
  • K8s Ingress Annotations参数使用指南
  • Kubernetes(K8S)入门以及命令指南
  • 自建prometheus监控腾讯云k8s集群
  • Go 1.25在性能方面做了哪些提升?
  • Next.js数据获取入门:`getStaticProps` 与 `getServerSideProps`
  • 为什么要在出口路由器router配置NAT与默认路由
  • 如何 正确使用 nrm 工具 管理镜像源
  • http response的工作流程详细解析
  • FastDFS(分布式RPC调用和分布式文件储存)
  • 国内开源时序数据库IoTDB介绍
  • TCL电视机音乐播放器动效背景模仿
  • 深入解析:Vue与React的异步批处理更新机制
  • 基于Spring Boot的火灾报警系统的设计与实现(代码+数据库+LW)
  • Spring Boot的配置文件加载顺序和规则
  • B.30.10.05-JVM电商实战应用
  • vulhub fastjson 1.2.24 反序列化导致任意命令执行漏洞