美文网首页
JDK 序列化

JDK 序列化

作者: 一生逍遥一生 | 来源:发表于2020-04-26 17:07 被阅读0次

序列化和分序列化概念

什么是序列化和反序列化

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;
对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。
序列化:序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

序列化的好处

  • 永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
  • 通过序列化以字节流的形式使对象在网络中进行传递和接收;
  • 通过序列化在进程间传递对象;

序列化算法一般步骤

  • 将对象实例相关的类元数据输出。
  • 递归地输出类的超类描述直到不再有超类。
  • 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
  • 从上至下递归输出实例的数据。

Java如何实现序列化和反序列化

ObjectOutputStream(对象输出流)的writeObject方法将对象进行序列化,把得到的字节序列写到一个目标输出流中;

ObjectInputStream(对象输入流)的readObject方法将输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

只有实现了Serializable或Externalizable(优先级高于Serializable)接口的类的对象才能被序列化,否则抛出异常!

JDK序列化的缺点

无法跨语言

Java 序列化技术是 Java 语言内部的私有协议,其他语言并不支持。

序列化后的码流太大

采用 JDK 序列化机制编码后的二进制数组大小是通过缓冲区处理后的 4 倍。

序列化性能太低

Java 序列化的性能只有二进制编码的 11% 左右,可见原生序列化的性能很差。

总结

  • 序列化时,只对对象的状态进行保存,而不管对象的方法;
  • 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口,就是具有继承性;
  • 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
  • 声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。
  • 实现序列化时,有一个序列化id,显式地定义serialVersionUID有两种用途:
    • 希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
    • 不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
  • Java有很多基础类已经实现了serializable接口。
  • 如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存!这是能用序列化解决深拷贝的重要原因。

参考文献

序列化和反序列化的底层实现原理是什么?
java 序列化 原理解析
Java 序列化 之 Serializable
Java 序列化之 Externalizable
Java 序列化 之 单例模式
Java序列化的原理
JDK1.8 序列化机制浅析
Java 序列化的缺点

相关文章

  • 关于WebLogic Server WLS 组件存在远程命令执行

    上周,我们公布了JDK XmlDecoder反序列化这一漏洞(jdk紧急漏洞,XMLDecoder反序列化攻击),...

  • Java 序列化之 Externalizable

    相关文章: Java 序列化 之 Serializable JDK中除了提供 Serializable 序列化接口...

  • Java常用序列化方式

    常用序列化方式 jdk自带对象序列化 对象需要实现Serializable接口 通过ObjectOutputStr...

  • rabbitmq采坑记

    rabbitmq序列化 生产者序列化 ,默认是jdk序列化 消费者序列化,不写的话,只能用字节数组接收,不能转换成...

  • java序列化框架对比

    目录 jdk 自带对象序列化类ObjectInput(Out)Stream 1.无法跨语言。这应该是java序列化...

  • jdk序列化失败

    对象通过jdk序列化方式保存,报错:Not Serializable XXX$1,$1是个匿名内部类,要序列化的对...

  • java序列化框架对比

    目录 jdk 自带对象序列化类ObjectInput(Out)Stream 1.无法跨语言。这应该是java序列化...

  • JDK 序列化

    序列化和分序列化概念 什么是序列化和反序列化 Java序列化是指把Java对象转换为字节序列的过程,而Java反序...

  • Java常见笔试面试题(持续更新中)

    Java基础 jdk和jre 介绍区别使用的jdk工具 生成对象 new反射反序列化cloneString str...

  • Serializable和Parcelable

    Serializable JDK提供序列化的标记接口,主要用于对象的持久化存储和网络传输。通过反射序列化,过程中产...

网友评论

      本文标题:JDK 序列化

      本文链接:https://www.haomeiwen.com/subject/mvjjwhtx.html