java序列化知识整理



1. 什么是序列化?

序列化就是只把一个对象串行化成一个字节流,用于网络传输或者持久化。

2. 序列化的使用场景?

a). 把内存中的对象持久化到文件或者数据库中;

b). 对象在网络上传输。

3. 序列化的实现?

1). 实现Serializable接口:

此方法简单,没有任何需要实现的方法。

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. 序列化存储规则:当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,文件大小不会翻倍,只是略有增加(新增引用的控制信息)。

你可能感兴趣的:(序列化)