一、概念
序列化:将Java对象保存到本地成二进制字节码(或者通过网络传输到另一台机器上,目前不太理解)。
反序列化:将序列化的二进制字节码转成Java对象。
二、目的
Java对象只存在于服务启动的时候,并且存于内存中,当程序运行完毕,对象就被销毁了。若需要运行过程中的对象,则可用序列化的方式保存下来。
三、做法
- 实现Serializable接口即可。在JavaBean的属性上加入transient修饰,可让对象以默认值序列化,也可重写writeObject(Object obj)和readObject()方法(jdk源码的集合就是这么干的,密码这种字段需加工就也需要用这种方法去序列化)
- 实现**Externalizable,**实现writeExternal(ObjectOutput out)和readExternal(ObjectInput in)方法
四、serialVersionUID的作用
private static final long serialVersionUID = 1l;//实体类做显示声明
当JavaBean类实现了序列化接口,没有显示声明serialVersionUID,JVM也会隐式声明一个serialVersionUID,但是当JavaBean有改变时,反序化会报错。
即反序列化时,JVM会拿本地的二进制字节码的serialVersionUID和JavaBean的serialVersionUID进行比较,隐式的serialVersionUID会在代码改变(如增加空格)后重新计算serialVersionUID,导致版本不一致。显示的声明且未改变serialVersionUID会用根据当前的JavaBean生成Java对象。即使JavaBean代码改变了,也会根据JavaBean来生成新的对象。
另外,JavaBean的属性在序列化后修改了该属性,反序列化出来的对象依然是之前序列化的那个。JavaBean加了static修饰的属性除外。
五、JavaBean类中有引用(或者继承父类)类型,引用(父类)类型也需要实现Serializable接口。