当前位置: 首页 > Web前端 > HTML5

连载:一个老家伙的咸鱼翻车(Java对象、XML、JSON、反序列化)

时间:2023-04-05 19:34:46 HTML5

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