kotlingson反序列化默认值失效深入讲解-创新互联

Gson反序列化原理

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、网站建设、外贸网站建设、任县网络推广、小程序设计、任县网络营销、任县企业策划、任县品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联建站为所有大学生创业者提供任县建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

原理简述


gson反序列化主要分为两个过程:

  • 根据TypeToken创建出对象
  • 根据json字符串解析数据,对对象属性赋值

对象的创建


ConstructorConstructor.get

  • 先尝试获取无参构造函数
  • 失败则尝试List、Map等情况的构造函数
  • 最后使用Unsafe.newInstance兜底(此兜底不会调用构造函数,导致所有对象初始化代码不会调用)
public  ObjectConstructor get(TypeToken typeToken) {
 final Type type = typeToken.getType();
 final Class<? super T> rawType = typeToken.getRawType();

 // first try an instance creator

 @SuppressWarnings("unchecked") // types must agree
 final InstanceCreator typeCreator = (InstanceCreator) instanceCreators.get(type);
 if (typeCreator != null) {
  return new ObjectConstructor() {
  @Override public T construct() {
   return typeCreator.createInstance(type);
  }
  };
 }

 // Next try raw type match for instance creators
 @SuppressWarnings("unchecked") // types must agree
 final InstanceCreator rawTypeCreator =
  (InstanceCreator) instanceCreators.get(rawType);
 if (rawTypeCreator != null) {
  return new ObjectConstructor() {
  @Override public T construct() {
   return rawTypeCreator.createInstance(type);
  }
  };
 }
 // 获取无参构造函数
 ObjectConstructor defaultConstructor = newDefaultConstructor(rawType);
 if (defaultConstructor != null) {
  return defaultConstructor;
 }

 // 获取List,Map等构造函数,对于List,Map的情况
 ObjectConstructor defaultImplementation = newDefaultImplementationConstructor(type, rawType);
 if (defaultImplementation != null) {
  return defaultImplementation;
 }

 // unSafe构造出对象,不调用任何的构造函数
 // finally try unsafe
 return newUnsafeAllocator(type, rawType);
 }

本文题目:kotlingson反序列化默认值失效深入讲解-创新互联
本文地址:http://scyanting.com/article/dejipo.html