1. 什么是序列化?
序列化就是只把一个对象串行化成一个字节流,用于网络传输或者持久化。
2. 序列化的使用场景?
a). 把内存中的对象持久化到文件或者数据库中;
b). 对象在网络上传输。
3. 序列化的实现?
1). 实现Serializable接口:
此方法简单,没有任何需要实现的方法。
笔者从业(web开发)两年一直使用该方法,本文以下主要讲解此方法。
2). 实现Externalizable 接口: Externalizable 是Serializable的子接口
此方法需要实现的方法,可以自己控制序列化的属性。
4. Serializable序列化的使用注意点
1. 序列化ID必须一致。
虚拟机允许反序列化有三个条件:类路劲一致,功能代码一致,两个类的序列化ID一致;
2. 对象A中引用对象B,A实现了序列化,则B也会被序列化;
3. 父对象实现序列化,则子对象也会被序列化
4. 子类对象被序列化,则父类对象不会被序列化,反序列化时调用默认的无参构造函数构造对象;
5. 序列化的对象中有属性前有transient修饰符时,该属性不会被序列化,因为该transient属性是临时的;
6. 序列化的对象中有属性前有static修饰符时,该属性不会被序列化,因为static代表次属性是类属性不是对象属性;
7. 序列化的对象中有属性属于敏感字段,需要加密传输,则需要自定义序列化和反序列化。需要注意的是,即使对象的属性是private也是不安全的,只有人工进行安全处理。
自定义方法:在序列化的类中自定义writeObject() 和 readObject()方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化,
如果没有这样的方法,则默认调用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法。
6. 序列化存储规则:当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,文件大小不会翻倍,只是略有增加(新增引用的控制信息)。