转自:码农翻身(微信号:coderising)

1、寒冬的蛰伏

这里的工作很繁忙,一年365天, 一天24小时几乎不停工。

但是我却是一个闲人, 因为我做的工作最近用的人太少了, 经常被冷落在一边。

大多数时候,我只能羡慕的看着线程、反射、注解、集合、泛型这些明星员工在那里忙忙碌碌, 听着他们充满激情的的大声说笑。

他们都叫我序列化,想想也是, 我的工作就是把一个Java 对象变成二进制的字节流, 或者反过来把字节流变成Java 对象, 这有什么意思?

当大家需要一个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很快就没落了, 我也随之被打入冷宫, 我也只好蛰伏下来,等待机会。

序列化生成代码

2、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自己都快没饭吃了。

3、新协议的崛起

其实我一直觉得我的二进制序列化方式能减少存储空间, 方便网络传输,只是我的硬伤是无法跨越语言。

不行, 我不能一直守着Java这一亩三分地了, 必须扩展支持多语言, 这样才能脱离Java环境。

有人说: 计算机的所有问题都可以通过增加一个中间层来解决。 我是不是也可以搞个中间层出来?

让这个中间层来定义/描述消息的格式,然后再弄一个小翻译器( 不,叫编译器显的更加高大上), 把这个程序员自定义的消息格式转换成各种语言的实现,例如java, python, c++等等。

在转换好的语言实现里边,自动包含了要被序列化的类的定义, 以及实现序列化和反序列化的代码, 当然序列化以后的数据是二进制的。

等到二进制的字节流通过网络传输到另外一台机器, 就可以反序列化为各种语言(例如Python)的对象了, 当然必须是同一个消息格式产生的Python类。
不仅仅是Python, C++, Go, C# , 甚至Javascript 都可以用 !

是不是很爽 ? 既语言中立, 又采用二进制传输, 体积小,解析快, 完美的综合了各种优点!

唯一的额外工作是需要把消息格式的定义编译成各种语言的实现, 为了能支持多语言,这也是没办法的事情 。

我得意的把新方案给XML和JSON这两个家伙看了, 从表情来看,就知道他俩如临大敌了。

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

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

序列化: 一个老家伙的咸鱼翻身(Java对象、XML、JSON、反序列化)相关推荐

  1. Java对象XML序列化框架-Simple2.0

    Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...

  2. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  3. gson转对象变成null_FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    转 https://blog.csdn.net/moneyshi/article/details/51830329 Java对象转换Json的细节处理 前言 Java对象在转json的时候,如果对象里 ...

  4. java对象转Json学习

    java对象转Json学习 json多用于数据存储.交换与传输,json相比于xml更小,更快,更容易解析 对象的表示方法 #java Person p = new Person(); p.setNa ...

  5. Java对象转JSON时如何动态的增删改查属性

    1. 前言 日常开发中少不了 JSON 处理,少不了需要在 JSON 中添加额外字段或者删除特定字段的需求.今天我们就使用Jackson类库来实现这个功能. 2. JSON 字符串增加额外字段 假如我 ...

  6. java 视图对象转换,使用spring boot开发时java对象和Json对象转换的问题_JavaScript_网络编程...

    将java对象转换为on对象,市面上有很多第三方jar包,如下: jackson(最常用) com.fasterxml.jackson.core jackson-databind 2.11.2 gso ...

  7. Java对象转换为Json对象

    前言 曾几何时,XML是程序员的宠儿,是数据传输.API.AJAX应用等方面的不二选择,但自从JSON横空出世后,或者你会发觉你身边就有很多人开始抛弃XML,在他们的心目中,JSON已经完全取代了XM ...

  8. Gson案例:Java对象与JSON字符串相互转换

    Gson案例:Java对象与JSON字符串相互转换 一.Gson概述 Gson是一个Java类库,可将Java对象转换为相应的JSON形式,也可以将JSON字符串转换为对应的Java对象.Gson是一 ...

  9. java对象与Json字符串之间的转化(fastjson)

    1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency><groupId>com.alibaba</groupId><artif ...

最新文章

  1. 防止人为误操作MySQL数据库技巧一例
  2. Lambda演算学习笔记
  3. mybatis_helloword(1)
  4. 《软件工艺师:专业、务实、自豪》一2.8 小结
  5. 关于pytorch里面的图像变换
  6. Unity3d导出Lightingmap的方法
  7. 【论文解读】图文并茂带你细致了解ELMo的各种细节
  8. java 如何去掉http debug日志_谈谈日志的最佳实践
  9. 演示u盘启动盘装系统教程
  10. ewebeditor漏洞大全
  11. sin35 在C语言中怎么表示,sin35度等于多少
  12. win10的开机启动文件夹
  13. snapchat_如何从Snapchat故事中删除快照
  14. linux 编辑文件 cat 跳到指定行,Linux基础命令(二)
  15. 77_Qt_承接【75】解决表格tableWidget添加行、列,删除行、列,以及下拉框comboBox动态跟随变化问题【难点:removeItem、addItem所需参数不同】
  16. C# 获取本地输入法列表,切换中英文输入法
  17. python 数独_Python中的数独检查器
  18. 新能源汽车行业资讯-2022-9-11
  19. 【Linux入门学习日记】ubuntu启动卡在logo界面
  20. DirectX 11各组件的介绍第一个DirectX 11 Demo的创建

热门文章

  1. 使用C#对MySQL进行操作
  2. 用计算机怎么计算sh 3,Shell 实现简单计算器功能
  3. GeoIP2数据库——根据ip确定国家/地区,过滤某区域ip
  4. 搞清品牌策划第一性原理
  5. 名悦集团告诉你开车上路,汽车压线到底会罚款吗
  6. I2C走线技巧、及上拉电阻、电源电压、总线电容三者间的函数关系
  7. deepstream学习笔记(二):gstreamer与deepstream-test1说明
  8. 浅谈国内大型B2B平台有哪些
  9. Java实现定时器的几种方法
  10. 一定要用相同的Context 对同一个receiver进行registerReceiver与unregisterReceiver吗?