二次编辑:
在 Java 中,我们处理的内容大多是对象。这是我们作为用户层面所感知到的。进一步深究,对象在 JVM 中实际上是在栈中被指针引用,实际数据存储在堆中。也就是说,它是一个复杂的数据结构,有多层调用。
在传输数据的过程中,栈中的引用、指针实际上对于传输数据是没有什么作用的,而且它是一层抽象,仅仅是为了说明该引用实际数据存储的地址。要与硬件进行读写操作时,硬件并不关心所谓的指针和引用地址,这对它来说没有任何用处,也不会用到。它关心的是实际的数据内容,也就是指针指向的实际数据内容(可能还有更多调用,谁知道呢?)
序列化就做了这个操作。它将原本在逻辑上层层堆叠的数据扁平化而交付给了硬件。那么未来我们怎么用呢?注意,通信肯定是有双方的,我们这里使用了序列化,未来就会进行反序列化,反序列化的操作是逆向的,就像一个通讯协议。
一次编辑:
汇编语言中有一个非常有趣的内容,如果使用 gdb 去调试 /bin/ls 这个程序,可以看到直接进入首行地址是不行的,因为在内存中,这个实际上是一个相对地址。
这也是为什么我们需要序列化。
因为按照正常的逻辑思路来说,为什么 Java 需要序列化多此一举呢?对象在内存中也是一个正常地一串二进制数据,为什么不能直接复制这些内容传输出去呢?
首先,这有点类似于我前面提到的像汇编中同样的问题。在 JVM 中,进程访问的是虚拟地址。如果我的电脑内存中存储的这个虚拟空间地址中的绝对地址,直接复制传输到另外一个人的电脑中,它的 JVM 启动并访问了这个绝对地址,也许会出大问题!
所以一个包装好的,内部处理好的完整的、精致整洁的处理类——序列化,它在安全意义上是非常重要的!