序列化的目的
- 序列化最终的目的是为了对象可以跨平台存储,和进行网络传输 (也可以在分布式应用系统中传递数据)
- 也可以是将对象以二进制字节序列的方式存储在硬盘上。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送;
发送方需要把这个类型数据(对象)转换为二进制字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。
什么情况需要序列化
经过上面的分析,已经很明确的知道凡是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化。包括json字符串,String类本身已经实现 implements java.io.Serializable接口。
序列化是将对象状态转换为可保持或可传输的格式的过程。通俗地说就是,如果想将一个实体类的整个实例对象的数据进行传输或者保存,你得转换成io流才能传输或者保存这就是序列化过程,这时又为了安全地反序列化恢复成实例对象就需要将实体类实现序列化接口,值得注意json字符串在传输的过程中也是序列化了的,序列化就是将对象(包括字符串等)转化为二进制的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。