读书人

alibaba fastjson(json序列化器)序列化

发布时间: 2012-09-11 10:49:03 作者: rapoo

alibaba fastjson(json序列化器)序列化部分源码解析

本文copy自http://www.flydmeng.com/index.php/code/alibaba-fastjson-json-serializer-chapter-source-analyse-one-global-analyse.html

?

?

fastjson官方地址: http://code.alibabatech.com/wiki/display/FastJSON/Home
??? 从javaeye上看到了阿里一位人士写的fastjson,特别是其中如何将java对象序列化成json字符串这段。笔者比较关注,因为在笔者的项目中就用了一个json序列化器(造的轮子)。就下载下来看了一看,先不说和笔者所用的轮子有何区别,单就用了一个简单的测试器,来测试一下两者的处理速度。测试代码就不贴了,简单地说下测试结果。在jvm充分优化的情况下(for循环执行了很多次之后),笔者所使用的java序列化器处理速度不是很均匀,在结尾有短暂的变化(可能与虚拟机回收有关系);而fastjson在后面的处理过程当中,一般很均匀(后来发现与使用的buf分配方式有关)。最主要的区别莫在于,fastjson的速度那是不能对比了。
??? 经过分析源码之后,发现fastjson在处理json优化上面还是下了很大的工夫的。笔者准备从以下几个方面对fastjson作一个简单的解析,也让使用fastjson的同学对fastjson有一个简单的认识。
??????? 1??? 总体分析??? 分析json序列化的总体思路和解析过程
??????? 2??? 性能分析A? 针对字符生产部分(即outWriter)对不同类型数据的处理和与性能相关处理部分
??????? 3??? 性别分析B? 针对序列化过程部分(即objectSerializer)对不同类型的序列化过程处理和与性能相关处理部分
??????? 4??? 对象解析分析??? 对javaBean解析部分和针对字段输出部分的处理和解析
??? 源码分析基于1.0.5版本。

??? 总体分析,首先上图,即fastjson的总体处理思想,其实也是所有json序列化器需要考虑的问题。

alibaba fastjson(json序列化器)序列化一部分源码解析

?

? ? 在这里,需要考虑的主要有两个部分,一是临时保存在序列化过程中用于储存数据的容器,二是处理对象序列化的序列化器。
? ? 在fastjson中,保存数据的容器使用了wirter,字符输出流,而且是自实现的一个字符输出流。相对原来的writer,追加了很多需要输出的信息的实现,比如输出一个字符串,输出一个字符,输出一个long类型数据等。而处理对象序列化的序列化器,而使用了责任链模式和工厂模式,将不同类型的java对象分散到不同的序列化器当中。而每个序列化器只处理与自身类型相对应的数据信息,这样就避免了在处理时,各种情况交织在一块,逻辑混乱的问题。
? ? 下面就源码本身作一个分析,其中结合两个部分进行分析。

?

? ? 代码分析部分

????首先,将一个对象序列化json字符串调用的是JSON对象的toJSONString方法,这里调用的是无参数方法。(注:本文不分析采用vistor实现json序列化代码的部分)。具体代码如下所示:

第一行,新产生的一个数据保存器,储存在序列化过程中产生的数据;第二行,产生统一的json序列化器,其中使用了outWriter,此类即json序列化的统一处理器;第三行,调用序列化方法开始序列化对象,以产生json字符串信息;第四行,返回已经储存的json信息。

?

              1. SerializeWriter?out?=?serializer.getWrier();??
              2. ????????Integer?value?=?(Integer)?object;??
              3. ????????out.writeInt(value.intValue());??

              ?

              ? ? 这 样即完成了一个完整的序列化工作。当然,对于复杂的数据类型,在实现过程中,可能需要递归地调用JsonSerializer的序列化工作,这得归结于如何处理不同的对象类型了。比如处理一个对象集合时,除需要处理集合本身之外,还需要处理集合中的每一个对象,这时又是一个解析过程。由于使用了同一个jsonSerializer,所以在进行数据处理时,输出的数据会按照在解析过程中的顺序,顺序地写入到outWriter中,这样即保证了数据的正确性。

              ?

              总结

              ??? 整个解析过程,相对来说,比较地简单。因为,这个解析工作从原理上来讲,也并不复杂。困难地在于,如何处理不同的数据类型,以及在处理过程中如何保证处理的效率。这即是fastjson之所以产生的原因。
              ??? 本篇从整个结构出发,对fastjson中的json序列化过程有了一个初步的理解,让大家都能够很好地正解fastjson,包括fastjson本身在实现上可能存在的不合理情况。在下一篇中,就效率实现上的两个重要方面(输出效率和解析过程)分别进行解析。

读书人网 >JavaScript

热点推荐