序列化和反序列化的概念:
当然序列化后的最终目的是为了反序列化,恢复成原先的Java对象,,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
使用场景:
序列化后的对象可以被写到数据库或文件中,也可用于网络传输。
即
对象持久化:将对象的状态持久化,比如存储到数据库中。
对象远程传输:将对象从一台计算机发送到另外一台计算机。
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
serialVersionUID:序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
显式地定义serialVersionUID有两种添加方法即对应两种用途:
1、当希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的 serialVersionUID;
2、当不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
-根据类名,接口名,方法和属性等生成
思考:一个子类实现了Serializable接口,它的父类没有实现Serializable 接口序列化该对子类对象,然后反序列化输出父类某域的数值,该变量与序 列化时的数值不同
解决:要想父类对象也序列化,就需要让父类也实现Serializable接口。如果 父类不实现的话就需要有默认的无参构造函数,在父类没有实现 Serializable接口时,虚拟机是不会序列化父对象的,而一个Java对象的 实例化过程必先伴随着父类对象的实例化,实例化也不例外。只能调用父类 对象的无参构造函数作为父类实例化。
Transient 关键字:
Transient 关键字作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
为什么要不被序列化呢,主要是为了节省存储空间,其它的感觉没啥好处,可能还有坏处(比如有些字段可能需要重新计算,初始化什么的),总的来说,利大于弊。
Transient 关键字可以使得字段不被序列化,还可以根据父类对象序列化的规则,将不需要被序列化的字段抽取出来放到父类中,子类实现 Serializable 接口,父类不实现,根据父类序列化规则,父类的字段数据将不被序列化。