Java序列化

183 阅读2分钟

一、概念

序列化:将Java对象保存到本地成二进制字节码(或者通过网络传输到另一台机器上,目前不太理解)。

反序列化:将序列化的二进制字节码转成Java对象。

二、目的

Java对象只存在于服务启动的时候,并且存于内存中,当程序运行完毕,对象就被销毁了。若需要运行过程中的对象,则可用序列化的方式保存下来。

三、做法

  1. 实现Serializable接口即可。在JavaBean的属性上加入transient修饰,可让对象以默认值序列化,也可重写writeObject(Object obj)和readObject()方法(jdk源码的集合就是这么干的,密码这种字段需加工就也需要用这种方法去序列化)
  2. 实现**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接口。

www.cnblogs.com/9dragon/p/1…

blog.csdn.net/u014750606/…

www.cnblogs.com/chenbenbuyi…