從設計角度看,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依然是泛型設計