晚上面阿里的第4轮面试(交叉面,其实应该算是第5面,因为中午已经面过HR了)时,面试官问到了Java对象的序列化,觉得有必要详细学习这块知识。
1 | java.io.Serializable |
如果没有实现该接口,在序列化时将抛出java.io.NotSerializableException。
每一个实现Serializable接口的类,都应该定义如下的属性:
1 | private static final long serialVersionUID |
序列化与反序列化
- 序列化使用java.io.ObjectInputStream::writeObject
1 | // java.io.ObjectInputStream |
- 反序列化使用java.io.ObjectOutputStream::readObject
1 | // java.io.ObjectOutputStream |
示例:
1 | import java.io.File; |
输出结果:
1 | stu: Student [no=20200423, name=hegongshan, sex=male, age=25] |
transient关键字
transient,翻译为”短暂的“,用于不对某些属性进行序列化。
1 | import java.io.File; |
输出结果:
1 | stu: Student [no=20200423, name=hegongshan, sex=male, age=25] |
自定义
如果在序列化和反序列化时,需要进行其他操作,必须实现特殊的方法,方法签名如下:
1 | private void writeObject(java.io.ObjectOutputStream out) throws IOException |