服务化基石之远程通信系列四:序列化协议之文本序列化

撸了今年阿里、腾讯和美团的面试,我有一个重要发现…….

在面向对象的编程语言中,对象是存在于内存中的。以Java为例,对象存在于运行状态的JVM中,如果希望能够在JVM停止运行后持久化的保存对象,则需要将内存中的对象转换为一定的格式化数据,这个过程称之为序列化。当JVM重启后,读取数据并重新转化为对象,称为反序列化。


因为各类成熟稳定的数据库存在,开发者几乎不会选择采用对象序列化的方式作为应用程序的信息持久化存储方案。但若将对象传递至网络,则对象本身同样离开了本地JVM所能管控的范畴,因此同样需要进行序列化和反序列化。分布式系统中的序列化主要用于应用程序在网络之间数据的交互。


概括来说,序列化协议是一种结构化数据格式,主要用于数据存储和消息传输。序列化是将对象转化为这种格式的方法。序列化的实现方案非常多,它所关注的重点是性能和异构语言的支持能力。


性能主要有3个指标:

1.   对象序列化后的字节占位大小。对象序列化之后是一串字节数组,其中包含对象的属性值以及元数据信息。


2.   序列化与反序列化的性能。这主要取决于它生成和解析字节数组的方法。


3.   序列化工具自身的性能。主要是序列化工具创建自身对象的消耗。

异构语言的支持则划分为文本和二进制两种解决思路。


文本序列化

通过字符串文本的明文序列化方式在网络传输中较为常见,JSON和XML这两种格式由于易于理解,且被各种开发语言广泛支持,因而十分流行。JSON格式由于配置简单,文本所占空间更小,而且对于JavaScript的支持更加原生,因此渐渐的取代了XML的主导地位,日前变得更加流行。


JSON是JavaScript Object Notation的缩写,它本身就是JavaScript的对象标记,可以直接转化为JavaScript的对象。JSON是一种轻量级的数据交换格式,它基于 W3C制定的ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式存储和表示数据。


虽然JavaScript可以无障碍的将JSON文本和对象相互转换,但却无法在Java中做到同样的事情。因此,运应而生了很多第三方处理JSON的序列化框架。我们介绍几个常用且有各自特点的JSON序列化框架。


流式解析JSON序列化框架Jackson

服务化基石之远程通信系列四:序列化协议之文本序列化

Jackson是一个开源的Java类库,它的主要用途是序列化Java对象为JSON文本,或反序列化JSON文本成为Java对象。Jackson采用流式增量的处理方式解析JSON, 因此在解析数据量比较大的JSON文本时比较有优势。Jackson主要由jackson-core和jackson-databind这两个模块组成。jackson-core为jackson-databind提供了底层的解析和生成JSON文本的方法,而jackson-databind则进行了更好的封装,提供了数据绑定和树模型功能。采用jackson-core的底层API进行JSON处理的方式性能最佳,但编码比较复杂,而数据绑定的方式则对开发比较友好。

下面是使用数据绑定的方式生成JSON的核心代码示例:


服务化基石之远程通信系列四:序列化协议之文本序列化


下面是使用数据绑定的方式解析JSON的核心代码示例:

服务化基石之远程通信系列四:序列化协议之文本序列化

轻量级JSON序列化框架Gson

服务化基石之远程通信系列四:序列化协议之文本序列化

Gson是Google公司开源的第三方Java库,它的用途与Jackson类似,使用起来较为便利,在处理较大的JSON文本时,其性能略逊于Jackson。Gson可以通过标识版本号来确保JSON的兼容性,我们同样以一个例子来说明如何使用Gson来序列化和反序列化对象。


Gson可以通过在对象属性上使用@Since注解,用于表示这个字段是在其声明的版本之后才出现的,在这个版本之前该属性可以忽略。Gson是可以通过它处理协议的向后兼容问题。


Gson还巧妙的复用了transient这个关键字。在对象中,声明了transient的属性不参与对象的序列化。关于transient关键字,我们在Java原生的序列化方案中还可以见到。


下面是使用Gson生成JSON的核心代码示例:

服务化基石之远程通信系列四:序列化协议之文本序列化


下面是使用Gson解析JSON的核心代码示例:

服务化基石之远程通信系列四:序列化协议之文本序列化

除了上面介绍的两款以外,还有很多类似的框架,如最早的JSON解析工具json-lib和阿里巴巴开源的高性能JSON解析框架fastjson等。


以上内容节选自

《 Java云原生 新一代分布式中间件架构》

服务化基石之远程通信系列四:序列化协议之文本序列化

 内容简介

【互联网架构不断演化,经历了从集中式架构到分布式架构,再到云原生架构的过程。云原生因能解决传统应用升级缓慢、架构臃肿、不能快速迭代等问题而成为未来云端应用的目标。本书首先介绍了架构演化及云原生的概念,让读者对基础概念有一个准确的了解。接着阐述容器调度、服务化、分布式等体系的原理,讲解分布式中间件设计方法。最后辅以实战,以中心化和平台化角度切入,深度揭秘两大开源项目Elastic-Job和Sharding-JDBC的实现】

服务化基石之远程通信系列四:序列化协议之文本序列化

尽请期待

服务化基石之远程通信系列四:序列化协议之文本序列化

《Java云原生 新一代分布式中间件架构》

2018年  将与您见面

书名尚未完全确定,欢迎您宝贵建议。

感谢大家关注“点亮架构”,欢迎对公众号文章的内容批评指正,如果有其他想要了解的技术问题,也可以留言提出。

‘点亮架构’的火炬,燃烧云原生‘

服务化基石之远程通信系列四:序列化协议之文本序列化

点击下面

赞(2) 打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。Java 技术驿站 » 服务化基石之远程通信系列四:序列化协议之文本序列化
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

关注【Java 技术驿站】公众号,每天早上 8:10 为你推送一篇技术文章

扫描二维码关注我!


关注【Java 技术驿站】公众号 回复 “VIP”,获取 VIP 地址永久关闭弹出窗口

免费获取资源

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏