用户您好!请先登录!

常用的序列化框架

常用的序列化框架

xml序列化

在java发展早期开始,为了统一接口,xml协议横空出世,良好的可读性,自由度极高的扩展性,成了很长一段时间的序列化标准规范。实现xml序列化/反序列化的方案有很多,最常见的是XStream 和 Java 自带的 XML 序列化和反序列化两种 ,并且还有基于xml协议的soap协议实现的webservice接口等。可以说xml序列化是开发中最常见也是发展时间最久的协议,并且支持跨进程和跨语言交互,但是缺陷也很明显,即xml规范下的每一个属性和值都是固定的标签形式,导致序列化后的字节流文件很大,远超于java自身的序列化方案,而且效率很低,一般建议使用在内部系统或者性能要求不高,但是对于接口的复杂度和准确性要求比较高的接口交互,或者适合多语言多进程之间交互的统一规范,不适合QPS过高的工程使用

JSON序列化

在xml序列化发展了多年后,也浮现了一些问题,比如开发并不简便,解析xml复杂度较高,还有xml的标准规范比较多,自由度过高,导致很难有效的指定格式校验等,于是一种新的轻量级的序列化交互的方案–JSON(JavaScript Object Notation)出现了,相对于xml来说,json格式语法简单,自由度较高,有很高的可读性,并且在JSON序列化后的字节流小于xml序列化的结果,解析起来更方便,于是基于JSON的接口成了新的标准规范之一,到现在也出现了很多JSON的序列化/反序列化的开源框架,比如开发中最常见到的Jackson、阿里巴巴开源的FastJson、谷歌的GSON等。

而这三种框架各有优劣,通过测试可以看出来序列化的时候,Gson的速度明显稍微慢了一些,Jackson反而最快,而在反序列化的时候,三个表现都很稳定,时间都差不多,但是当数据比较大的时候,测试结果又有所不同,测试结果和数据来自其它网址提供的代码和脚本,可以得出对应结论:

  • 1、 当数据小于 100K 的时候,建议使用 Gson
  • 2、 当数据100K 与 1M 的之间时候,建议使用各个JSON引擎性能差不多
  • 3、 当数据大与 1M 的时候,建议使用 JackSon 与 FastJson

而在稳定性上面,默认情况下Gson在各种情况下的表现最好,Jackson配合对应的配置化也能达到很好的稳定性,而FastJson表现的不稳定,所以对于这几种json库的使用,建议环境较复杂场景下使用JackSon,加上自定义的配置化可以更灵活的处理更多的场景,但是在复杂度一般,仅仅在乎性能的场景下,建议使用FastJson,因为FastJson的api更易用,依赖少,简单场景下使用简单

Hessian序列化

Hessian是一个支持跨语言传输的二进制文本序列化协议,对比Java默认的序列化,Hessian的使用较简单,并且性能较高,现在的主流远程通讯框架几乎都支持Hessian,比如Dubbo,默认使用的就是Hessian,不过是Hessian的重构版

Avro序列化

Avro序列化设计初衷是为了支持大批量数据交换的应用,支持二进制序列化方式,并且自身提供了动态语言支持,可以更加便捷、快速处理大批量的Avro数据

Kyro序列化

Kyro序列化是主流的比较成熟的序列化方案之一,目前广泛使用在大数据组件中,比如Hive、Storm等,性能比起Hessian还要优越,但是缺陷较明显,不支持跨语言交互,在dubbo2.6.x版本开始已经加入了Kyro序列化的支持

Protobuf序列化

Protobuf是谷歌提出的序列化方案,不同的是此方案独立于语言、平台,谷歌提供了多个语言如java、c、go、python等语言的实现,也提供了多平台的库文件支持,使用比较广泛,优点在于性能开销很小,压缩率很高,但是缺陷也很明显,可读性很差,并且protobuf需要使用特定语言的库进行翻译转换,使用起来较为麻烦

行走的code
行走的code

要发表评论,您必须先登录