Gson源代码解析
Gson源码解析
源码版本基于2.10.1
分析方向
由于Gson是用于做序列化和反序列的一个框架。所以核心方法也就两个
toJson
fromJson
后续也只会对如上两个方法进行分析
toJson
toJson方法有不少的重载方法,不过按类型划分就两种。
- Object -> String
- JsonElement -> String
由于JsonElement用于序列化的情况比较少见,所以真正采用的只有Object-> String的序列化
之后会对
public String toJson(Object src)
进行分析
1 | public String toJson(Object src) { |
非null object序列化
1 | public String toJson(Object src, Type typeOfSrc) { |
序列化
1 | public void toJson(Object src, Type typeOfSrc, Appendable writer) throws JsonIOException { |
序列化过程
1 | public void toJson(Object src, Type typeOfSrc, JsonWriter writer) throws JsonIOException { |
adapter
可以发现gson的序列化采用了适配器设计模式,即object -> json string的过程时由adapter完成的。
1 | public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) { |
factory
Gson
的序列化使用TypeAdapter
进行适配,而TypeAdapter
是由TypeAdapterFactory
进行创建
TypeAdapterFactory
是存放在Gson一个成员里卖弄
1 | for (TypeAdapterFactory factory : factories) { |
factory存放在一个List里面
1 | final List<TypeAdapterFactory> factories; |
factory生成
1 | Gson(Excluder excluder, FieldNamingStrategy fieldNamingStrategy, |
ReflectiveTypeAdapterFactory
factory类型都类似,但是其中比较重要的是,
ReflectiveTypeAdapterFactory
因为大部分的Java Bean都会使用它
1 |
|
FieldReflectionAdapter
write方法
关于read方法将在之后的fromJson分析
1 | public void write(JsonWriter out, T value) throws IOException { |
小结
可见的是toJson进行序列化的核心其实就是通过获取adapter然后借用adapter对实现从Object到String的序列化操作。
其中有一个万用的Adapter,
FieldReflectionAdapter
他会使用反射去拿所有的Field,并将Field转入基础类型的Adapter。Adapter的序列化会触发Field的序列化过程,整个Object就转为了Json字符串
fromJson
和toJson类似,fromJson也会经过几层包装
1 | public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException { |
1 | public <T> T fromJson(String json, TypeToken<T> typeOfT) throws JsonSyntaxException { |
1 | public <T> T fromJson(Reader json, TypeToken<T> typeOfT) throws JsonIOException, JsonSyntaxException { |
1 | public <T> T fromJson(JsonReader reader, TypeToken<T> typeOfT) throws JsonIOException, JsonSyntaxException { |
核心读取逻辑
FieldReflectionAdapter.java
1 | public T read(JsonReader in) throws IOException { |
小结
- fromJson的实现中有一个有些类似于词法解析器的东西,通过JsonReader读取数据,再有Adapter对读取的数据做整合,写入到对象中。
- 反序列过程中依然是和Adapter深度关联的,使用Adapter的
read
方法实现从JsonReader
中读取数据。
总结
- Gson的序列化采用了适配器的设计模式实现了Object -> JSON 和JSON -> Object的转换
toJson
方法在转化Json的时候会有层级关系,所以JsonWriter会维护一个栈,遇上json object,json array,等都会进行压栈,结束层级就会出栈。fromJson
方法在转化Object的过程中需要一一读取字符,JsonReader中封装了较多相关的方法,采用了一种类似于词法解析的方法,在有限的状态间进行转换。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 理想三巡!