当前位置: 首页 > 科技观察

连载:老家伙咸鱼翻车

时间:2023-03-21 19:15:56 科技观察

1。寒冷的冬天这里的工作非常忙碌,一年365天,几乎一天24小时不间断。但我是个闲人,因为我做的工作最近用的人太少了,经常被冷落。很多时候,我只能羡慕地看着线程、反思、注释、收藏、泛型等明星员工在那里忙碌,听着他们热情洋溢的谈笑风生。他们都叫我连载。想想也是。我的工作是将Java对象转换为二进制字节流,反之亦然。这有什么意义呢?当你需要一个Java对象而不用到该对象时,没有必要直接使用new。自然,可怕的垃圾回收会在对象不再使用时对其进行处理。但存在是合理的。在JDk1.1时代,我就已经存在了。那时候人们的思想很超前:网络就是计算机。每个Java对象都应该能够在网络中传播:从一台机器开始,变成二进制字节流,沿着网络穿越千山万水,到达另一台机器,在那里转化为Java对象,操作继续的地方。既然可以二进制方式漫游网络,自然可以将这些字节流保存到硬盘中。当JVM停止,整个世界都崩溃了,线程、反射、注解都不复存在了,而我的字节流也会在硬盘上默默等待,等待下一次JVM重生,恢复对象。所以我觉得我的工作也很有价值。从某种意义上说,我可以让Java对象跨越时空永生!这种永生是有代价的。首先你得用Java,这是废话,因为我只是java对象序列化。虽然二进制字节流的格式是公开的,你可以用任何语言(C、C++、Python……)来解析读取,但是解析之后有什么用呢?那些字节流会告诉你这个是哪个类的数据,字段的类型和值,但是如果你没有相应的Java类,你还是无法构建Java对象。其次,序列化两边的类必须保持一致,否则肯定会出问题。大多数人不知道,在上个世纪末本世纪初,我还是用J2EE火了一阵子。当时J2EE中有个东西叫RMI,其实就是JavaRPC。由于我的出色工作,开发人员可以轻松调用远程服务器上的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序列化看起来像这样abc

xyz
,这是通过网络传输绝对是一种浪费!我的java字节流不一样,二进制的,非常紧凑,一点也不浪费!”XML小哥沉默,demo,我也抓住了你的痛点。两天后,这小伙又带来了一个叫JSON的小哥,他得意地展示我:使用JSON之后,数据精简了很多,不信你看:{"name":"abc","address":"xyz"},现在我们不仅是语言中立的,而且还很精简,老家伙,现在你无话可说了。我承认,但它并没有让XML高兴多久。他没想到的是,在Web时代,JSON和Javascript是绝配,并且他们共同统治了浏览器。连XML本身都快断粮了。3.新协议的兴起其实我一直认为我的二进制序列化方式可以减少存储空间,方便网络传输,但是我的弱点是我不能跨语言,不行,我不能一直守着Java的三亩地,我必须扩展支持多种语言,才能脱离Javaen环境。有人说:所有的计算机问题都可以通过加一个中间层来解决。我也可以创建一个中间层吗?让这个中间层定义/描述消息的格式,然后得到一个小型翻译器(不是,让编译器更强大),将这个程序员定义的消息格式转换成各种语言实现,比如java,python,c++,etc.在转换后的语言实现中,自动包含了要序列化的类的定义和实现序列序列化和反序列化的代码,当然,序列化后的数据是二进制的。当二进制字节流通过网络传输到另一台机器时,可以反序列化为各种语言(如Python)的对象。当然必须是同样消息格式生成的Python类。不仅是Python、C++、Go、C#,连Javascript都可以用!是不是很酷?它是语言中性的,采用二进制传输,体积小,解析速度快,完美融合了各种优点!唯一额外的工作是将消息格式的定义编译成各种语言的实现。为了支持多种语言,这也是不可能的。我得意洋洋地向XML和JSON展示了新的计划,从他们的表情来看,我知道他们大敌临头了。我也把方案提交给了我们服务器世界的老大。他大为赞赏,决定先在某些场景下使用。例如,当对象存储在缓存中时,它们需要被序列化。之前用json很占空间,所以改成我的新方案后,既减少了空间的使用,又提高了读写效率,效果不错。我赢了这一轮,现在找我用新方案连载的人越来越多,但最后谁能胜出还很难说。最有可能的情况是各种解决方案混合使用。即便如此,我也很满足。【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获取授权公众号coderising】点此查看该作者更多好文