论坛首页 Java企业应用论坛

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

浏览 20004 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-06-20  
JE帐号 写道
刚听说fastjson,请问性能方面和jackson相比如何?
另外,是否支持流输出?用作服务器时,支持流输出,在性能以及减少内存碎片方面还是很有实用价值的.


有测试的,序列化方面,fastjson已经有足够的性能优化了。在parser方面,比jackson快。详见
http://www.iteye.com/post/1812607
0 请登录后投票
   发表时间:2011-06-20   最后修改:2011-06-20
wenshao 写道
JE帐号 写道
刚听说fastjson,请问性能方面和jackson相比如何?
另外,是否支持流输出?用作服务器时,支持流输出,在性能以及减少内存碎片方面还是很有实用价值的.


支持的,比如:

public static final void write(Writer out, Object object) {
    SerializeWriter writer = new SerializeWriter();
    try {
        JSONSerializer serializer = new JSONSerializer(writer);
        serializer.write(object);
        writer.writeTo(out);
    } catch (IOException ex) {
        throw new JSONException(ex.getMessage(), ex);
    } finally {
        writer.close();
    }
}


哈,刚看了一下,原来这个fastjson是那个"吹牛:我写的JSONParser可能是这个星球上最快了(Java)"帖子里提到的解析器,不过当时只看了一下题目,以为又是口水帖,直接掠过了... 结果错过了这个好东西!!!

大概看了一下fastjson的wiki,感觉很不错,前一阵为项目找json-lib的替代品时,没有看到这个项目,否则可能就选择它了.哈哈.当时也是比对了好几个,最后才选定jackson,没有其他依赖包,性能好,订制性强,就是太大了,allInOne包有900k+,太疯狂了.fastjson也有以上的优点,体积还小,不过可能就是订制性方面没有jackson强,不过我好像看到最新版的也加入了什么日期时间的格式订制,namefilter和valuefilter什么的,这就比较实用了.我们实际使用中遇到过别人系统的传过来的属性值首字母大写(没法修改,不同语言不同的命名习惯),还有一些密码字段需要加密或忽略的情况,都要求json解析器需要一定的订制能力.总体来说,fastjson应该是够大部分项目使用了.jackson貌似越来越复杂了,支持的内容和特性一堆一堆的,都看不过来.

我随便做了个fastjson和jackson的流输出对比(写了个EmptyWriter),使用jconsole监控了一下,没有什么复杂的jvm预热,也没有自动化跑多次,很简陋的手工启动跑了几次,貌似还是jackson略快一点,内存方面jackson也少一些,不知为什么.测试用的bean类如下,data声明了100000长度,每个元素都是String.valueOf(i);

public class VO {	
	private String[] data;
	public String[] getData() {
		return data;
	}
	public void setData(String[] data) {
		this.data = data;
	}
}



另外我大概看了一下,流输出的时候,fastjson应该还是先将json拼在SerializeWriter里的char[]了,和我想得流输出还是不太一样,我的想法是转换一部分就向out输出一部分,这样虽然对堆内存没什么影响,但是对于非堆内存应该还是可以节省一些的,另外在遇到的SerializeWriter需要扩容的时候也能再减少一些时间和内存.(这个纯属于想当然,没测试过,纯探讨.)


0 请登录后投票
   发表时间:2011-06-20  
JE帐号 写道
wenshao 写道
JE帐号 写道
刚听说fastjson,请问性能方面和jackson相比如何?
另外,是否支持流输出?用作服务器时,支持流输出,在性能以及减少内存碎片方面还是很有实用价值的.


支持的,比如:

public static final void write(Writer out, Object object) {
    SerializeWriter writer = new SerializeWriter();
    try {
        JSONSerializer serializer = new JSONSerializer(writer);
        serializer.write(object);
        writer.writeTo(out);
    } catch (IOException ex) {
        throw new JSONException(ex.getMessage(), ex);
    } finally {
        writer.close();
    }
}


哈,刚看了一下,原来这个fastjson是那个"吹牛:我写的JSONParser可能是这个星球上最快了(Java)"帖子里提到的解析器,不过当时只看了一下题目,以为又是口水帖,直接掠过了... 结果错过了这个好东西!!!

大概看了一下fastjson的wiki,感觉很不错,前一阵为项目找json-lib的替代品时,没有看到这个项目,否则可能就选择它了.哈哈.当时也是比对了好几个,最后才选定jackson,没有其他依赖包,性能好,订制性强,就是太大了,allInOne包有900k+,太疯狂了.fastjson也有以上的优点,体积还小,不过可能就是订制性方面没有jackson强,不过我好像看到最新版的也加入了什么日期时间的格式订制,namefilter和valuefilter什么的,这就比较实用了.我们实际使用中遇到过别人系统的传过来的属性值首字母大写(没法修改,不同语言不同的命名习惯),还有一些密码字段需要加密或忽略的情况,都要求json解析器需要一定的订制能力.总体来说,fastjson应该是够大部分项目使用了.jackson貌似越来越复杂了,支持的内容和特性一堆一堆的,都看不过来.

我随便做了个fastjson和jackson的流输出对比(写了个EmptyWriter),使用jconsole监控了一下,没有什么复杂的jvm预热,也没有自动化跑多次,很简陋的手工启动跑了几次,貌似还是jackson略快一点,内存方面jackson也少一些,不知为什么.测试用的bean类如下,data声明了100000长度,每个元素都是String.valueOf(i);

public class VO {	
	private String[] data;
	public String[] getData() {
		return data;
	}
	public void setData(String[] data) {
		this.data = data;
	}
}



另外我大概看了一下,流输出的时候,fastjson应该还是先将json拼在SerializeWriter里的char[]了,和我想得流输出还是不太一样,我的想法是转换一部分就向out输出一部分,这样虽然对堆内存没什么影响,但是对于非堆内存应该还是可以节省一些的,另外在遇到的SerializeWriter需要扩容的时候也能再减少一些时间和内存.(这个纯属于想当然,没测试过,纯探讨.)


我认为你的推断不恰当 
0 请登录后投票
   发表时间:2011-06-21  
性能的比较要基于一个前提,就是在实现相同功能的前提下。

朋友介绍这个帖子,所以稍微看了下,又稍微看了下两边的代码。在Jackson中,可以动态添加serializer,在解析javaobject的时候,可以支持annotation,过滤不需要的member等等。

简单以快慢来论没有意义。
0 请登录后投票
   发表时间:2011-06-21  
nijian 写道
性能的比较要基于一个前提,就是在实现相同功能的前提下。

朋友介绍这个帖子,所以稍微看了下,又稍微看了下两边的代码。在Jackson中,可以动态添加serializer,在解析javaobject的时候,可以支持annotation,过滤不需要的member等等。

简单以快慢来论没有意义。


fastjson也有这样的功能啊,不单可以动态添加Serializer,支持Annotation,还可以配置NameFilter、ValueFilter
0 请登录后投票
   发表时间:2011-06-21  
wenshao 写道
nijian 写道
性能的比较要基于一个前提,就是在实现相同功能的前提下。

朋友介绍这个帖子,所以稍微看了下,又稍微看了下两边的代码。在Jackson中,可以动态添加serializer,在解析javaobject的时候,可以支持annotation,过滤不需要的member等等。

简单以快慢来论没有意义。


fastjson也有这样的功能啊,不单可以动态添加Serializer,支持Annotation,还可以配置NameFilter、ValueFilter



fastjson只是在field上加了annotation,可是jackson不仅支持field,还支持member method,constructor,这里面都包含了不少逻辑。
其实我的意思只是说,单单讨论性能,而不基于功能是不对的。
0 请登录后投票
   发表时间:2011-06-21  
呵呵,jackson那900k+的身材可不是吃素的,太大而全了,要不然现在都开始分包发放了.
fastjson足够好了.不过宣传力度还是不够啊.哈哈
0 请登录后投票
   发表时间:2011-06-21  
什么时候楼主把从json字符串解析到对象分析下
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics