在做java开发的时候,经常需要在对象上加序列化即实现implements Serializable 接口,这个接口没有任何的方法需要实现。这么做的目的是干什么的?这个目的在于,他做了一个标志,表示这个类是可以被用来序列化的,可以进行网络传输,可以以二进制的形式保存在文件系统中。
Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。
那么为什么需要序列化呢?
第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。
第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。
验证文件存储为什么需要序列化:
字符串是已经实现了Serializable接口的
如果按正常字符串写入到文件中,使用sublime打开,会发现文件中存放的是二进制的数据:
如果没有序列化,会有报错信息:
为什么要保存成二进制数据呢?通过跟踪源码可以发现,java是根据一定的规范/协议将数据转化成二进制保存起来的。不建议看下去,太绕了。总之记住一句话:如果要对对象进行保存,就需要进行序列化。网络传输为什么需要序列化呢?计算机计算时只能使用二进制,因为只有高电平和低电平,所以用二进制,用十进制表示只是为了方便些,如果用二进制表示结果不把你看的累死
(1)可行性。由于二进制只有两种可能的取值0和1,因此在物理上最容易实现,可以用电子元件的两种不同状态来表示。如开关的接通和断开,晶体管的导通和截止,电位电平的高与低等。
(2)简易性。二进制的运算规则也比较简单,二进制的加法规则有4条:0+0=0;0+1=1;1+0=1;1+1=0(有进位),而十进制的加法规则有100条,因而使计算机运算器的硬件结构大大简化。
(3)逻辑性。由于二进制0和1正好盒逻辑代数的假(false)真(ture)相对应,有逻辑代数的理论基础,用二进制表示二值逻辑很自然。
总之记住一句话:计算机的电子元件使用二进制能比较快速进行逻辑判断和计算,所以网络传输需要进行序列化,转为二进制处理。