定义:将对象的状态信息转换为可以存储或传输的形式的过程。
在序列化期间,对象将其当前状态写入到存储区。以后,通过从存储区中反序列化对象的状态,重新创建该对象(百度百科)
序列化的目的:1、将对象持久化;2、将对象从一个地方传递到另一个地方。
实现了Serializable和Externalizable接口才能被序列化。
序列化接口没有方法或字段,仅用于标识可序列化的语义。
序列化时,遇到不支持 Serializable 接口的对象。抛出NotSerializableException。
序列化并不保存静态变量。
Externalizable:继承自 Serializable,由自身控制序列化行为
- 需重写writeExternal()与readExternal()方法。
serialVersionUID:序列化的版本号,实现了Serializable接口都有的的静态变量
取值:
- 不显示定义,根据类自动生成。修改类重新编译发生改变。
- 固定的 1L
- 随机生成的 long 类型数据(JDK 工具)
用途:
- 类的不同版本对序列化兼容
- 不希望类的不同版本对序列化兼容
Transient 关键字:阻止变量被序列化
序列化流:
- ObjectInputStream,ObjectOutputStream:序列化流
- readObject:读取对象
- writeObject(Object obj):写入对象
引用类型的成员变量:必须标识可序列化,否则报异常
自己总结重点: 序列化一般用输出流,把对象写入到存储区,比如文件,反序列化用输入流,读取文件内容转华为对象。
实现序列化到文件:
- 实现Serializable接口
- 根据路径创建FileInputStream对象fis
- 根据fis创建ObjectInputStream对象
- writeObject方法写入对象