1.定义
序列化:java对象 --> 字节序列 的过程
反序列化:字节序列 --> java对象 的过程
2.作用
序列化:过程中,保证对象的完整性和可传递性,转换成字节序列可以再网络上传输或者保存在本地文件,例如:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://data.txt")); oos.writeObject(user);
反序列化:根据字节流中保留的对象状态及描述信息,通过反序列化重建对象,例如
File file = new File("D://data.txt"); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); User user = (User)ois.readObject();
附加,关键点
声明一个实体类,实现Serializable接口
使用ObjectOutputStream类的writeObject方法,实现序列化
使用ObjectInputStream类的readObject方法,实现反序列化
3.优缺点
优点:
1.将对象转为字节流存到硬盘上,当JVM宕机后,直接会在硬盘上等待JVM下一次开机,并将字节流转换成对象,而且序列化的二进制能够减少存储空间
2.序列化后的字节流可以进行网络传输。
3.通过序列化可以在进程间传递对象。
缺点:
1.java的序列化无法跨语言,也就是当跨进程进行服务调用,调用的是其他语言,序列化就不好用了
2.序列化后的流的长度比通过缓冲区要长的多
3.序列化性能太低
4.序列化场景
1.分布式传输对象,或者网络传输
2.调用在一个JVM,结果返回到另一个JVM
3.序列化保存对象状态
4.数据传输,复原
5.远程调用,分布式存储,缓存存储
6.一些重要的,例如密码字段选择性不让序列化(使用transient)
5.注意事项
1.方式
(1)实现Serializable接口
(2)实现Externalizable接口(需要实现方法)
2.序列化ID问题
是否可以反序列化private static final long serialVersionUID = 1L;要一致。
3.静态字段不会序列化
序列化是不保存静态变量,序列化保存的是对象的状态,静态变量属于类的状态
4.transient
transient代表对象的临时数据
5.父类的序列化
当父类实现了序列化,子类自动实现序列化,反过来之类实现序列化,父类必须实现序列化
6.并非所有的对象都可序列化