1.java序列化与反序列化是什么?
序列化:将数据结构或对象转换成二进制字节流的过程
反序列化:将在序列化过程中多生成的二进制字节流转换成数据结构或者对象的过程
2.为什么需要序列化和反序列化
对象、文件、数据,有很多不同的格式,很难统一传输和保存,序列化以后都是字节流了,这样就能进行通用的格式传输或者保存
3.序列化实现的方式有哪些?
1、实现Serializable(可串行化的)接口(隐式序列化)
会自动序列化所有非staic和transient关键字修饰的成员变量
序列化接口没有方法或字段,仅用于标识可序列化的语义
2、实现Externalizable(可外化的)接口(显式序列化)
1.Externalizable接口继承于Serializable,该接口定义了两个抽象方法:writeExternal()和readExternal()
2.在实现该接口时,必须重写writeExternal()和readExternal()方法,否则所有变量的值都会变成默认值
4.什么是serialVersionUID?
serialVersionUID用来表明类的不同版本间的兼容性
java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的,在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为一致,可以进行反序列化,否则就会出现序列化版本不一致的异常
5.为什么还要显示指定serialVersionUID的值?
当对同一个实体序列化和反序列化时,需要serialVersionUID值一致才能成功,如果我们不显式指定serialVersionUID,那么在序列化时会自动生成一个UID值,当实体类改动时,反序列化时又会生成一个新的UID,那么字节流里的UID和我们实体类的UID值不同,那么反序列化就会失败,但是如果我们显式指定了UID,那么反序列化的UID就是原序列化的UID。
6.serialVersionUID什么时候修改?
当对类的结构进行不兼容的更改时
为了进一步扩展,对类的不兼容更改将阻止反序列化机制创建对象的实例,因为流中存在未映射到当前类定义的信息。
7.java序列化中如果有些字段不想进行序列化,怎么办?
使用transient(临时的)关键字修饰
延申:
1.transient(临时的)关键字作用:就是让某些被修饰的成员属性变量不被序列化
2在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反3.序列化后,transient变量的值被设为初始值,如int型的是0
transient只能修饰变量,不能修饰类和方法
8.静态变量会被序列化吗?
不会,因为序列化保存的是对象状态,而static变量时属于类的状态,静态变量优先于对象存在,随着类的加载而加载,因此序列化并不保存静态变量。