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类。file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-1764.png
不仅仅是Python, C++, Go, C# , 甚至Javascript 都可以用!是不是很爽? 既语言中立,又采用二进制传输, 体积小,解析快, 完美的综合了各种优点!唯一的额外工作是需要把消息格式的定义编译成各种语言的实现, 为了能支持多语言,这也是没办法的事情 。我得意的把新方案给XML和JSON这两个家伙看了, 从表情来看,就知道他俩如临大敌了。
 
 
我也把方案提交给了我们服务器世界的老大 , 他大为赞赏, 决定先在部分场景下用起来, 例如对象存入缓存的时候需要序列化, 以前用json,   占用空间很大, 改用了我的新方案以后, 不但减少了空间使用, 还提升了读写的效率, 效果不错。
 
我成功地扳回了一局,现在找我用新方案来做序列化的人越来越多了, 但是最终鹿死谁手还很难说,最有可能的情况是,各种方案混合使用, 即使是这样,我也很满足了。

程序启动:Serialize奋斗史的更多相关文章

  1. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  2. 应用程序启动管理 Winform版

    ★前言      开发这个小工具的想法主要是机器中安装了数据库,每次设置开机启动数据库服务的话,则系统启动很慢,每次都得手动到服务管理器中停止服务,很是繁琐,相信不少做开发的朋友会遇到同样的问题,就有 ...

  3. IOS程序启动原理

    1.Info.plist 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 常见属性(红色 ...

  4. iOS程序启动过程

    First, the function creates the main application object (step 3 in the flowchart). If you specify ni ...

  5. 详解 IOS 7.1 程序启动原理

    程序都是从Main方法入口的 IOS 也不例外 int main(int argc,char * argv[]) { @autoreleasepool { return UIApplicationMa ...

  6. VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)

    之前写的一个VC应用程序,是程序启动时就直接出现在任务栏, 窗体不出现,等用户点击任务栏图标再出现窗口.和一些防火墙什么的软件类似. 这种效果实现并不是很困难的,硬是找不到最好的.为什么呢? 首先,在 ...

  7. iOS app 程序启动原理

    iOS app 程序启动原理 Info.plist: 常见设置     建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...

  8. iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信

    一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...

  9. 游戏服java程序启动,显示内存溢出

    1.OutOfMemoryError:Java heap space 过程:服务器上面的mysql突然异常重启,导致了程序启动的时候报错 问题1:OutOfMemoryError:Java heap ...

  10. iOS开发UI篇—程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

随机推荐

  1. Python:json 模块

    字符串转dict.list data = "[{....},{...},...]" list_data = json.loads(data) dict.list转字符串 list ...

  2. 使用 vant 的 v-lazy 实现图片 vue 在移动端的懒加载

    官方文档:https://youzan.github.io/vant/#/zh-CN/lazyload 引入 Lazyload 是 Vue 指令,使用前需要对指令进行注册 import Vue fro ...

  3. mysql中date与datetime的区别

    date类型可用于需要一个日期值而不需要时间部分时.MySQL 以 'YYYY-MM-DD' 格式检索与显示date值.支持的范围是 '1000-01-01' 到'9999-12-31'. datet ...

  4. pom.xml文件中properties有什么用

    properties标签的作用: 在标签内可以把版本号作为变量进行声明,后面dependency中用到版本号时可以用${变量名}的形式代替,这样做的好处是:当版本号发生改变时,只有更新properti ...

  5. Cisco AP-如何识别思科胖瘦AP

    思科的胖瘦AP识别的方式不止一种,这里简单的总结一些我了解到的方式: 1.根据思科AP的型号 这个和思科不同时期的产品有关系,老一点的和新一些的AP命名上存在差别,这里简单举例: 类型1:AIR-LA ...

  6. Linux下如何查看tomcat是否启动、查看tomcat启动日志(转)

    在Linux系统下,重启Tomcat使用命令的操作! 1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh ...

  7. Fedora26下Mysql改密码Unknown column 'password' in 'field list'

    本意向修改一个用户的密码,网上搜到的命令为如下 1 mysql> update user set password=password(“新密码”) where user=”用户名”; 执行后报错 ...

  8. CSS背景图片设置

    *{ margin:0px; padding:0px; list-style: none; text-decoration: none; font-family: Arial,'Microsoft Y ...

  9. 关于Java大整数是否是素数

    题目描述 请编写程序,从键盘输入两个整数m,n,找出等于或大于m的前n个素数. 输入格式: 第一个整数为m,第二个整数为n:中间使用空格隔开.例如: 103 3 输出格式: 从小到大输出找到的等于或大 ...

  10. RestTemplate HttpMessageConverter报错的解决方案no suitable HttpMessageConverter

    错误 no suitable HttpMessageConverter found for response type and content type [text/html;charset=UTF- ...