转自:码农翻车(微信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序列化成这样
