为什么我们需要序列化?


二次编辑:

在 Java 中,我们处理的内容大多是对象。这是我们作为用户层面所感知到的。进一步深究,对象在 JVM 中实际上是在栈中被指针引用,实际数据存储在堆中。也就是说,它是一个复杂的数据结构,有多层调用。

在传输数据的过程中,栈中的引用、指针实际上对于传输数据是没有什么作用的,而且它是一层抽象,仅仅是为了说明该引用实际数据存储的地址。要与硬件进行读写操作时,硬件并不关心所谓的指针和引用地址,这对它来说没有任何用处,也不会用到。它关心的是实际的数据内容,也就是指针指向的实际数据内容(可能还有更多调用,谁知道呢?)

序列化就做了这个操作。它将原本在逻辑上层层堆叠的数据扁平化而交付给了硬件。那么未来我们怎么用呢?注意,通信肯定是有双方的,我们这里使用了序列化,未来就会进行反序列化,反序列化的操作是逆向的,就像一个通讯协议。


一次编辑:

汇编语言中有一个非常有趣的内容,如果使用 gdb 去调试 /bin/ls 这个程序,可以看到直接进入首行地址是不行的,因为在内存中,这个实际上是一个相对地址。

这也是为什么我们需要序列化。

因为按照正常的逻辑思路来说,为什么 Java 需要序列化多此一举呢?对象在内存中也是一个正常地一串二进制数据,为什么不能直接复制这些内容传输出去呢?

首先,这有点类似于我前面提到的像汇编中同样的问题。在 JVM 中,进程访问的是虚拟地址。如果我的电脑内存中存储的这个虚拟空间地址中的绝对地址,直接复制传输到另外一个人的电脑中,它的 JVM 启动并访问了这个绝对地址,也许会出大问题!

所以一个包装好的,内部处理好的完整的、精致整洁的处理类——序列化,它在安全意义上是非常重要的!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇