1.前方高能

在这电子与数据风驰电掣的世界里,人们一刻不停歇的工作着。

但是我却是一个被冷落的人, 因为我做的工作最近用的人太少了。大多数时候,我只能羡慕的看着线程、反射、注解、集合、泛型这些明星员工在那里忙忙碌碌,听着他们充满激情的的大声说笑。他们都叫我序列化,想想也是,我的工作就是把一个Java 对象变成二进制的字节流,或者反过来把字节流变成Java 对象,这有什么意思?

2.存在即是合理

当大家需要一个Java 对象的时候, 直接new 出来不就得了,  对象不用了自然有令人胆战心惊的垃圾回收去处理。但是存在即合理, 在JDk1.1的时代,我就已经存在了。 当时人们的思想很超前: 网络就是计算机。 一个个Java 对象应该可以在网络中到处旅行 : 从一个机器出发时,就变成二进制字节流,顺着网络跨过千山万水,到达另外一台机器,在那里摇身一变,恢复成Java 对象, 在那里继续运算。既然可以以二进制方式在网络中漫游, 那自然也可以把这些字节流存到硬盘中,当JVM停机,整个世界坍塌以后, 线程,反射,注解都不复存在了, 而我的字节流还会在硬盘上默默等待, 等待下一次JVM的重生, 把对象恢复。所以我觉得我的工作也很有价值,某种意义上来讲, 我可以让Java 对象跨越时间和空间而永生!

当然这种永生是有代价的, 首先你必须得用Java, 这是废话, 因为我只是java对象序列化。虽然那二进制字节流的格式是公开的,你可以用任何语言(C,C++,Python...)去解析读取, 但是解析以后又有什么用处呢?那些字节流中会告知你这是哪个类的数据,字段的类型和值,但是如果你没有相对应的Java 类,还是无法构建出Java 对象出来。

其次, 做序列化双方的类必须得一致, 要不然肯定出乱子。大部分人都不知道在上个世纪末和本世纪初,我还是随着J2EE火了一阵, 当时J2EE中有个叫RMI东西, 其实就是Java RPC。  由于我卓越的工作, 开发人员用可以轻松的调用远程服务器上的Java 方法,就相当于调用本地方法一样, 很方便。可惜的是这个RMI只能用在Java环境中,对于服务器来说这根本不是问题,但是当时Web应用正在兴起, 一个浏览器中是很难有Java环境的, 所以RMI很快就没落了, 我也随之被打入冷宫, 我也只好蛰伏下来,等待机会。

3.Xml与Json的找茬

后来我们这里来了一个叫XML的小伙子,很受大家的欢迎, 都喜欢把Java 对象序列化的工作交给他去做。我不能坐以待毙,我仔细的观察了几天以后, 终于发现这个家伙有个大缺点: 太复杂了!对于我的Java 序列化,大部分情况下你只需要让你的类实现Serializable接口, 我就可以接管后续的所有工作。不用你操心了。

可是用XML, 你还得写一堆代码把一个类中的各个字段和他们的值变成XML标签/属性/值 才行。  当用来表示对象的XML字符串漫游到另外一个机器上, 还得有一堆代码把XML变成对象。我嘲笑XML说: “小伙子, 你这也太麻烦了吧, 人类的时间多宝贵, 为了用XML做序列化,代价好高嗷!”“老家伙,没你想的那么复杂,你可能不知道,我们有些类库能自动帮助把对象变成XML” 他毫不示弱。

“ 不要忘了 ”  小伙子补充道 “ 我们XML可是语言中立的, 在这里是Java对象, 到了客户端 什么语言都行 , Java/C/Python/Ruby.... 都没问题, 甚至浏览器里的Javascript都能处理,这一点你不行了吧?”这家伙戳到了我的痛处,  在浏览器中我的确需要一个Java 环境才行运行 ,  唉,真是成也Java ,败也Java。我说: “我知道你是语言无关的, 但是你注意到没有,你的XML标签冗余太多, 真正的数据很少。 比如有个Person类,有两个字段name和address,  用你的XML做序列化就变成了这个样子<person><name>abc</name><address>xyz</address></person>,这在网络上传输起来绝对是一种浪费!  我的java 字节流就不一样了, 二进制的,非常紧凑,一点都不浪费!“XML小伙子沉默了, 小样, 我也抓住了你的痛点。

过了两天,这个小伙子又带来了一个叫JSON的小弟, 他得意洋洋的向我炫耀: 用了JSON以后,数据精简多了,不信你看:{"name”:“abc","address":"xyz"}  , 现在我们不但语言中立,还很精简,老家伙,这下你无话可说了吧。我认栽, 但是让XML也没高兴多久, 让他没有想到的是, Web时代JSON和Javascript是一对绝配,联手统治了浏览器。 连XML自己都快没饭吃了。

4.救命稻草:新协议的降临

其实我一直觉得我的二进制序列化方式能减少存储空间, 方便网络传输,只是我的硬伤是无法跨越语言。不行, 我不能一直守着Java这一亩三分地了, 必须扩展支持多语言, 这样才能脱离Java环境。有人说:计算机的所有问题都可以通过增加一个中间层来解决。我是不是也可以搞个中间层出来?

让这个中间层来定义/描述消息的格式,然后再去弄一个小小翻译器, 把这个程序员自定义的消息格式转换成各种语言的实现,例如java, python, c++等等。在转换好的语言实现里边,自动包含了要被序列化的类的定义, 以及实现序列化和反序列化的代码,当然序列化以后的数据是二进制的。等到二进制的字节流通过网络传输到另外一台机器, 就可以反序列化为各种语言(例如Python)的对象了,当然必须是同一个消息格式产生的Python类。

不仅仅是Python, C++, Go, C# , 甚至Javascript 都可以用!是不是很爽? 既语言中立,又采用二进制传输, 体积小,解析快, 完美的综合了各种优点!唯一的额外工作是需要把消息格式的定义编译成各种语言的实现,为了能支持多语言,这也是没办法的事情 。我得意的把新方案给XML和JSON这两个家伙看了,从表情来看,就知道他俩如临大敌了。

我也把方案提交给了我们服务器世界的老大, 他大为赞赏, 决定先在部分场景下用起来, 例如对象存入缓存的时候需要序列化, 以前用json,  占用空间很大, 改用了我的新方案以后,不但减少了空间使用, 还提升了读写的效率, 效果不错。

我成功地扳回了一局,现在找我用新方案来做序列化的人越来越多了, 但是最终鹿死谁手还很难说,最有可能的情况是,各种方案混合使用,即使是这样,我也很满足了。

serialization的真情自述相关推荐

  1. 使用Boost的Serialization库序列化STL标准容器

    使用Boost做对象序列化是非常方便的,本文将介绍一种序列化STL标准容器的方法. 这是之前设计的异步框架的一个子功能:过程A将标准容器数据序列化成二进制流,然后将该二进制数据发送到过程B,过程B将数 ...

  2. PyTorch 源码解读之 torch.serialization torch.hub

    作者 | 123456 来源 | OpenMMLab 编辑 | 极市平台 导读 本文解读基于PyTorch 1.7版本,对torch.serialization.torch.save和torch.hu ...

  3. 陶哲轩自述考砸经历:智商高达230的数学天才,却因没复习险些挂科

    机器之心报道 编辑:蛋酱.小舟 很难相信,智商高达 230 的陶哲轩(Terence Tao),也会在一场考试中险些挂科.从这篇自述文章中,我们可以近距离感受到,数学天才的荣耀背后,是多少个不懈探索的 ...

  4. 蚂蚁金服大佬自述:保持学习力,永远胜过不切实际的一夜暴富幻想!

    近日,蚂蚁金服上市,估值2000亿美元,不少蚂蚁大佬纷纷实现财务自由,大家纷纷表示柠檬酸了的各种羡慕之情. 据朋友圈蚂蚁金服大佬自述:掌握岗位核心技能.保持学习力,永远胜过不切实际的一夜暴富幻想.其实 ...

  5. 谷歌员工论坛自述引程序员羡慕,只招募最优秀的人,薪资福利超棒

    提起谷歌,相信互联网圈子的人都不会陌生,能够进去这家企业,意味着今后的职业发展道路不会太差.一名标签为谷歌的员工在公司论坛自述工作经历,引来了众多程序员的羡慕. 大家最关心的是如何进谷歌.对此,楼主回 ...

  6. 数据结构与算法的八股文自述(持续更新)

    数据结构与算法的八股文自述 1.1 排序算法 冒泡排序: 冒泡排序只会操作相邻的两个数据.每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求.如果不满足就让它俩互换.一次冒泡会让至少一个 ...

  7. MySQL的八股文自述(持续更新)

    MySQL的八股文自述 1.1 讲讲MVCC MVCC(多版本并发控制):多版本控制-锁机制可以控制并发操作,但是系统开销较大,而MVCC可在大多数情况下替代行锁,使用MVCC 能降低其系统开销. M ...

  8. 操作系统的八股文自述(持续更新)

    操作系统的八股文自述 1.1 虚拟内存 虚拟内存是计算机系统内存管理的⼀种技术,我们可以⼿动设置⾃⼰电脑的虚拟内存. 虚拟内存为每个进程提供了⼀个⼀致的.私有的地址空间,**它让每个进程产⽣了⼀种⾃⼰ ...

  9. 计算机网络的八股文自述(持续更新)

    计算机网络的八股文自述 1.1.三次握手和四次挥手过程,以及为什么需要三次握手,两次不行吗?为什么需要四次挥手呢?为什么需要等待 2MSL ,客户端才会处于关闭状态呢? 三次握手的过程: 首先由客户端 ...

最新文章

  1. 2 并发编程--开启进程的两种方式
  2. 【机器学习】多项式回归原理介绍
  3. 深入剖析Redis系列(七) - Redis数据结构之列表
  4. 企业级应用能帮助闪存走出产能过剩时代吗?
  5. 9月全球浏览器份额之争:IE领先Chrome21.73%
  6. MTU 设置错误导致防火墙或者路由器断网
  7. 万用socket神器Linux Netcat 命令
  8. php类的的属性值,PHP面向对象之旅:类的属性
  9. 软件开发生命周期模型
  10. [恢]hdu 2040
  11. Group by的使用方法
  12. 电力系统的常用仿真模块MATLAB/SIMULINK(2)
  13. 一文搞懂Handler机制原理
  14. vue项目中使用ts入门
  15. 巧吃支付宝新年红包,再也不用担心钱花不出去了(售货机里面的饮料售空也没事哦)
  16. OpenStack 云主机的创建
  17. jQuery手风琴菜单的制作
  18. 无线串口模块通信技术参数快速选型指南
  19. FineBI 将聚合之后的结果,再求平均值
  20. RT系统+STM32+SYN8266播报+红外定时器

热门文章

  1. oracle cpio,cpio - 手册页部分 1: 用户命令
  2. 关于RecyclerView的缓存
  3. dom 兄弟_DOM技巧和技巧:父母,孩子和兄弟姐妹
  4. 2019 ICPC Asia Nanjing Regional I. Space Station题解
  5. 把“你的书,我的书”换一换
  6. MySQL实战45讲--日志和索引相关问题(15)
  7. C语言怎么写p2p搜索程序,p2p的C语言实现 该源码实现了一个P2P的服务器端和客户端 - 下载 - 搜珍网...
  8. 《计算机软件测试规范》学习记录
  9. 卸载磁盘报错device is busy
  10. MSTPVRRP协议