首先感谢高铁同学同意我撰写fastjson源码解析并且给予了必要的指导,fastjson是一个高效的json与java对象序列化框架,很多公司和开源框架都从fastjson中受益。
目前网上公开的fastjson源码解析太少或者缺少深度,因此我计划通过研究源码的方式并记录下来,让更多想了解底层实现的同学受益。如果在阅读过程中发现错误,欢迎与我沟通 。
邮箱:jason.shang@hotmail.com
微信:skyingshang
可以在线阅读gitbookfastjson源码解析,也可以参考已经添加注释的源码fastjson注释版本_master分支。
我在工作之余编写源码解析的目的:
- 做技术应该追求极致和细节,让更多的人拥抱开源并从中受益
- 深入理解fastjson作者的设计思想
- 掌握基本的词法和语法分析实现
- 源码是最好的教材,降低阅读开源代码的成本
- 巩固技术基础
- 分享是一种美德
为了尊重作者的劳动,如果您转载请保留以下内容:
文章作者 : 诣极(商宗海)
框架作者 : 高铁
文章地址 : https://zonghaishang.gitbooks.io/fastjson-source-code-analysis/content/
代码地址 : https://github.com/zonghaishang/fastjson
框架地址 : https://github.com/alibaba/fastjson
概要
fastjson核心功能包括序列化和反序列化,序列化的含义是将java对象转换成跨语言的json字符串。我认为从这里作为分析入口相对比较简单,第二章会从反序列化角度切入,会包含词法分析等较为复杂点展开。
现在,我们正式开始咀嚼原汁原味的代码吧,我添加了详细的代码注释。
SerializeWriter成员变量
com.alibaba.fastjson.serializer.SerializeWriter
类非常重要,序列化输出都是通过转换底层操作,重要字段如下:
/** 字符类型buffer */
private final static ThreadLocal<char[]> bufLocal = new ThreadLocal<char[]>();
/** 字节类型buffer */
private final static ThreadLocal<byte[]> bytesBufLocal = new ThreadLocal<byte[]>();
/** 存储序列化结果buffer */
protected char buf[];
/** buffer中包含的字符数 */
protected int count;
/** 序列化的特性,比如写枚举按照名字还是枚举值 */
protected int features;
/** 序列化输出器 */
private final Writer writer;
/** 是否使用单引号输出json */
protected boolean useSingleQuotes;
/** 输出字段是否追加 "和:字符 */
protected boolean quoteFieldNames;
/** 是否对字段排序 */