谈谈我对Gson源码的理解

1 MainActivity.kt

data class Person(val name: String,val age: Int)

class MainActivity : AppCompatActivity() {
   

    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val person = Gson().fromJson("{"name":"gerry","age":18}", Person::class.java)
    }

}

2 Gson.java

public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException {
   
  Object object = fromJson(json, (Type) classOfT);
  return Primitives.wrap(classOfT).cast(object);
}


  public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
   
    if (json == null) {
   
      return null;
    }
    StringReader reader = new StringReader(json);
    T target = (T) fromJson(reader, typeOfT);
    return target;
  }


  public <T> T fromJson(Reader json, Type typeOfT) throws JsonIOException, JsonSyntaxException {
   
    JsonReader jsonReader = newJsonReader(json);
    T object = (T) fromJson(jsonReader, typeOfT);
    assertFullConsumption(object, jsonReader);
    return object;
  }


  public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {
   
      //  ... 省略其他代码
       TypeToken<T> typeToken = (TypeToken<T>) TypeToken.get(typeOfT);
      // 第一步 getAdapter 获取适配器
      TypeAdapter<T> typeAdapter = getAdapter(typeToken);
      // 第二步 read 创建对象并给对象赋值
      T object = typeAdapter.read(reader);
      // 第三步返回对象
      return object;
  }

3 getAdapter 获取适配器

public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
   
     // .....  这里省略了一些读缓存的重要代码,具体见目录5的介绍
  
      // 3.1 这个 factories是什么?
      for (TypeAdapterFactory factory : factories) {
   
         // 3.2 这个 factory.create 如何创建的?
        TypeAdapter<T> candidate = factory.create(this, type);
        if (candidate != null) {
   
          // call 其实是 candidate 的代理类 
          call.setDelegate(candidate);
          typeTokenCache.put(type, candidate);
          return candidate;
        }
      }
  
     // ..... 
  }

3.1 这个 factories是什么?

是一个 TypeAdapterFactory 集合,在Gson创建时就被添加了各种Factory,具体如下图所示

   final List<TypeAdapterFactory> factories;
    
   // 下面开始添加各种  TypeAdapterFactory
   List<TypeAdapterFactory> factories = new ArrayList<TypeAdapterFactory>();

    // built-in type adapters that cannot be overridden
    factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
    factories.add(ObjectTypeAdapter.FACTORY);

    // the excluder must precede all adapters that handle user-defined types
    factories.add(excluder);

    // users' type adapters 如果我们有自定义的 TypeAdapterFactory 会在这里被提前添加,为什么会这么靠前?
    // 因为遍历集合时会首先找到自定义的TypeAdapterFactory
    factories.addAll(factoriesToBeAdded);

    // type adapters for basic platform types
    factories.add(TypeAdapters.STRING_FACTORY);
    factories.add(TypeAdapters.INTEGER_FACTORY);
    factories.add(TypeAdapters.BOOLEAN_FACTORY);
    factories.add(TypeAdapters.BYTE_FACTORY);
    factories.add(TypeAdapters.SHORT_FACTORY);
    TypeAdapter<Number> longAdapter = longAdapter(longSerializationPolicy);
    factories.add(TypeAdapters.newFactory(long.class, Long.class, longAdapter));
    factories.add(TypeAdapters.newFactory(double.class, Double.class,
            doubleAdapter(serializeSpecialFloatingPointValues)));
    factories.add(TypeAdapters.newFactory(float.class, Float.class,
            floatAdapter(serializeSpecialFloatingPointValues)));
    factories.add(TypeAdapters.NUMBER_FACTORY);
    factories.add(TypeAdapters.ATOMIC_INTEGER_FACTORY);
    factories.add(TypeAdapters.ATOMIC_BOOLEAN_FACTORY);
    factories.add(TypeAdapters.newFactory(AtomicLong.class, atomicLongAdapter(longAdapter)));
    factories.add(TypeAdapters.newFactory(AtomicLongArray.class, atomicLongArrayAdapter(longAdapter)));
    factories.add(TypeAdapters.ATOMIC_INTEGER_ARRAY_FACTORY);
    factories.add(TypeAdapters.CHARACTER_FACTORY);
    factories.add(TypeAdapters.STRING_BUILDER_FACTORY);
    factories.add(TypeAdapters.STRING_BUFFER_FACTORY);
    factories.add(TypeAdapters.newFactory(BigDecimal.class, TypeAdapters.BIG_DECIMAL));
    factories.add(TypeAdapters.newFactory(BigInteger.class, TypeAdapters.BIG_INTEGER));
    factories.add(TypeAdapters.URL_FACTORY);
    factories.add(TypeAdapters.URI_FACTORY);
    factories.add(TypeAdapters.UUID_FACTORY);
    factories.add(TypeAdapters.CURRENCY_FACTORY);
    factories.add(TypeAdapters.LOCALE_FACTORY);
    factories.add(TypeAdapters.INET_ADDRESS_FACTORY);
    factories.add(TypeAdapters.BIT_SET_FACTORY);
    factories.add(</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值