从设计角度看,Adapter很容易联想到适配器设计模式。不错!TypeAdapter正是一个适配器,它提供了数据类型和Json格式转换的通道。在Gson的设计中,TypeAdapter负责对各种数据类型进行转换,比如:整型、Map类型、自定义类型等。TypeAdapter使用泛型设计,提供了两个抽象方法write和read。
把对象输出到JsonWriter中。JsonWriter提供了输出各种类型属性的方法,通过重载提供了write(..)/value(...)方法,具体和参考JsonWriter的介绍
public abstract void write(JsonWriter out, T value) throws IOException
方法名称指明了需要做的业务,参数则提供了更通用的入参类型Writer。
该方法可以把对象输出到Writer类型的输出流中。内部实现上使用包装类JsonWtiter完成输出格式的转换。
public final void toJson(Writer out, T value) throws IOException
方法不指定输出参数,默认返回json格式的String类型结果。实际上使用的是StringWriter完成输出流转换的,具体操作是,创建StringWriter之后,调用前面的方法。从而完成json数据格式转换
public final String toJson(T value)
和上一个方法类似,差别在于实现的时候,使用的是JsonTreeWriter完成数据格式转换的。JsonTreeWriter的实现在后续的博客中会继续介绍
public final JsonElement toJsonTree(T value)
解析json数据,从JsonReader中读取json数据,并完成对象创建和属性赋值,从而恢复出完成的数据对象
public abstract T read(JsonReader in) throws IOException
对read方法的扩展,接受更加通用的Reader格式输入,内部实现使用JsonReader对Reader包装,完成输入流格式转换,并调用前一个方法,达到从输入流恢复出对象的目的
public final T fromJson(Reader in) throws IOException
从json字符串恢复对象属性,使用StringReader对String类型的输入数据进行包装,并且调用前面的方法,达成对象赋值的目的
public final T fromJson(String json) throws IOException
从JsonElement中恢复对象信息,使用JsonTreeReader对JsonElement类型的输入数据进行包装,然后调用前面的方法恢复出数据对象。
public final T fromJsonTree(JsonElement jsonTree)
TypeAdapter是泛型设计,提供了基本的接口封装,但是核心的reader和writer接口还需要子类实现。Gson内部提供了大量的子类(包括匿名子类,私有子类,公有子类等)。下图是几个public类型的子类
其中,TreeTypeAdapter和ArrayTypeAdapter依然是泛型设计