ora-02289: 序列不存在_序列化的前世今生

说到序列化,编程中会经常遇到,比如网络传输中、跨进程通信等等都需要进行序列化。

什么是序列化

把对象转化为可传输的字节序列过程称为序列化。反之,对应的有反序列化:把字节序列还原为对象的过程称为反序列化。

从上面的定义中,看到对象、字节序列这两个关键信息。对象指的是我们采用面向对象编程中的对象,像现在常见的高级编程语言java、python 都有对象一说,字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位,字节序列就是字节的集合。

为什么要转换?

有人说为啥网络传输、跨进程通信就需要把对象转换为字节数组呢?不能直接传输对象吗?这个问题可以说困扰很多的编程人员,尤其是没有专业基础知识的码农,显然不把这个问题弄懂和透彻,很多人就心里一直纠结,老是感觉有些困惑。我就是这种人,我一般想理解一个问题,想把它追溯到计算机硬件层面才算为止。

回答这个问题涉及到对象的含义,对象在计算机内存中含义,了解计算机传输的本质,跨进程通信。嗯?这么多吗?是的,需要这么多知识,才能从根本上去回答这个问题,而不仅仅限制于java语言,以及简单的一句因为网络传输需要序列化所以要序列化,然后就不知道了。同时,你也会了解为啥java 的I/O 框架的设计以及这样设计的背后原因。

什么是对象

对象是一种抽象思维,把某个事物的属性和行为作为一体,封装起来。这样的好处就是方便于问题的梳理、程序的设计和编写。对象只是人为的构想出的一种解决问题的方法,在计算机其实是不存在的,计算机只会通过基本数据结构把某个对象的相关属性和方法存储起来,并做相应的标识,让他们产生关联。

对象在计算机内存的含义

程序运行时,其中的对象在参与运算时,这时候对象会被放到寄存器中,存放的形式依然是通过表存放的,而所谓的对象仍然是不存在的。同时寄存器还保存了程序运行的环境,所以说对象只有在程序运行时才是有意义的,存在的,一旦程序不存在了,对象也就无从说起。

计算机传输

信息跨网络传输会被转化为比特流(二进制的字符串),对应物理电流的高低电平,就是网络传输只支持二进制比特流。之前我们说了先把对象转化为字节数组,字节数组怎么转化为比特流的呢?这个工作是操作系统做的,就是操作系统内部集成的TCP/IP 协议加上套接字socket 共同实现的。如果想要在深处探究,可以自行研究。这里明白一点就是实际物理传输是把电气信号经过编码产生的特定码元(0和1),然后通过0和1 对应二进制比特流的0和1.

跨进程通信

跨进程通信就是不同的程序运行时通信的过程。跨进程就是说跨越程序,之前说过当对象脱离之前的程序,进入到其他程序,就说明了维持对象存在的上下文环境不存在了。也就不能称之为对象了。就只能用这个操作系统规定的格式(不同系统规定不一样)字节流。

从面向对象到计算机传输字节流

前面说了什么是对象,对象在计算机内存的含义,计算机传输本质、跨进程通信都是想要说明这样的道理:

总结

我们在某个具体高级编程语言,编程语音采用了更符合人类思维的面向对象的方式,提出了“对象”概念,以供编程者使用,而且对象仅仅在程序运行时才在寄存器存在,当脱离这个环境后且变得毫无意义。另外对象在网络传输时,是不存在这样对象的概念以及寄存器环境,所以就需要把对象转换成网络传输时支持的比特流/字节流;在跨进程传输时,由于会脱离之前的运行环境,导致对象的含义不在存在,所以跨进程传输信息时,需要转换为操作系统规定的统一数据格式(字节流)。然后上面说的两种情况的转化就是所谓的 序列化。到这里才算是把序列化的含义解释清楚。

在谈序列化

看了上面的讲解,再回过头来想想序列化,你会发现序列化不是java语音特有的,是和进程有关的,是和操作系统有关的,是和物理世界的信息传输有关的。到你把问题考虑到这一层次,相信你在看到这方面的东西,你的理解肯定更深层次一些。

本质上存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。

序列化只是一种拆装组装对象的规则,那么这种规则肯定也可能有多种多样,比如现在常见的序列化方式有:比如jdk、json、xml、字节流等等。采用哪一种方式跟它的特性有关,是否跨平台,是否跨语言。jdk 就不支持跨语言,只能序列化java 语言,json、xml支持跨语言。

这里我们会发现,序列化的同时会遵守一些规则,然后在反序列化的时候才能根据规则进行还原为原来的对象。比如json,他的规则就是他的语法,xml 也有它的格式规范。我们在序列化与反序列化都遵循同样的规范就能跨语言了。

总结

上述的总结从整个宏观层面去阐述了序列化及其含义,全面彻底了掌握了序列化背后要素。仍然有一些东西没有细说,比如字节流怎么转化为比特流,什么时候转化的。以上内容是自己的理解,大致的思想没有错,可能有一些地方有错误。欢迎指正!

一个有意思的、才艺多的android 开发人员,史建华 ——爱阅读,爱写作。

点个在看 你最好看

a729912416f12368836138488d31b382.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值