以下为 Jean 学习笔记和习题整理,供学习和参考
# 是什么?
序列化: 把对象转换为字节序列的过程。
** 反序列化:** 把字节序列恢复成 Java 对象的过程。
# 为什么?
类的对象会随着程序的终止而被垃圾收集器销毁。在 Java 中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用此对象。但是,我们创建出来的这些对象都存在于 JVM 中的堆(heap)内存中,只有 JVM 处于运行状态的时候,这些对象才可能存在。一旦 JVM 停止,这些对象也就随之消失;如果不重新创建对象并且调用该类,该怎么做?这时,可以通过序列化将数据转换为字节流。
序列化可以将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或者通过网络发送到任何其他程序。
# 怎么做?
# Serializable
通过实现 java.io.Serializable 接口,可以在 Java 类中启用可序列化。它是一个 标记
接口,意味着它不包含任何方法或字段,仅用于标识可序列化的语义。
如果试图对一个没有实现 Serializable
接口的类的实例进行序列化,会抛出 NotSerializableException
异常。
SerialVersionUid 序列化版本号的作用是用来区分我们所编写的类的版本,用于判断反序列化时类的版本是否一直,如果不一致会出现版本不一致异常。
# transient
如果一个对象的类实现了 Serializable 接口,但是包含一个不可序列化的数据域,则该对象不可序列化。为了使该对象可序列化,需要给不可序列化的数据域加上关键字 transient
。
transient 修饰符仅适用于变量,不适用于方法和类。
静态变量不是对象状态的一部分,因此它不参与序列化。所以将静态变量声明为 transient 变量是没有用处的。
❓问题一:序列化 & 反序列化有什么区别?