java序列化问题
作者:bin1、序列化ID
序列化id不一致,导致无法反序列化。
比如有同一个服务,部署在2台机器,同一个POJO,但是用的是2个不同的序列化ID, 那么类做序列化存储时,读取出来的无法进行反序列化
A服务:
private
static
final
long
serialVersionUID = 1L;
B服务:
private
static
final
long
serialVersionUID = 2L;
2、静态变量
静态变量不会被序列化,序列化是保存对象的状态,静态变量是类的状态,序列化并不保存静态变量
3、父类序列化
序列化子类的时候,父类的值不会被序列化,如果父类对象也要被序列化的话,就需要父类也实现Serializable接口。
或者父类需要有默认的无参构造函数,在子类进行反序列化时,会对应去调用父类的构造函数
4、Transient关键词
关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
5、变量值加密
我们可以使用,用户自定义的 writeObject 和 readObject 方法,在其中添加加密和解密方法
6、序列化存储规则
我们将2个相同对象,进行文件存储,重复存储2次,会发现,2次存储,占用的空间,实际上并没有2倍增加,因为java序列化机制为了节省空间,实际上存的是一个引用。所以在如果2次写对象,并且对象的属性值不一样时,需要注意,2次反序列化取出的值都会是一样的,因为存的是引用